在了解jvm的结构之前,我们有必要先来了解一下操作系统的内存基本结构:


操作系统中的jvm


为什么jvm的内存是分布在操作系统的堆中呢??因为操作系统的栈是操作系统管理的,它随时会被回收,所以如果jvm放在栈中,那java的一个null对象就很难确定会被谁回收了,那gc的存在就一点意义都没有了,而要对栈做到自动释放也是jvm需要考虑的,所以放在堆中就最合适不过了。 操作系统+jvm的内存简单布局


从上图中,你可以看到,jvm的内存结构居然和操作系统的结构惊人的一致,再来看一个图。看我下面红色的标注


你应该不难发现,原来jvm的设计的模型其实就是操作系统的模型,基于操作系统的角度,jvm也就是一个应用(java.exe/javaw.exe),而基于class文件来说,jvm就是个操作系统,而jvm的方法区,也就相当于操作系统的硬盘区,所以方法区也被叫做permanent区,因为这个单词是永久的意思,也就是永久区。而java栈和操作系统栈是一致的,无论是生长方向还是管理的方式,至于堆嘛,虽然概念上一致目标也一致,分配内存的方式也一直(new,或者malloc等等),但是由于他们的管理方式不同,jvm是gc回收,而操作系统是程序员手动释放,所以在算法上有很多的差异. 看下面的图。


将这个图和上面的图对比多了什么?没错,多了一个pc寄存器,所谓pc寄存器,无论是在虚拟机中还是在我们虚拟机所寄宿的操作系统***能目的是一致的,计算机上的pc寄存器是计算机上的硬件,本来就是属于计算机,计算机用pc寄存器来存放“伪指令”或地址,而相对于虚拟机,pc寄存器它表现为一块内存(一个字长,虚拟机要求字长最小为32位),虚拟机的pc寄存器的功能也是存放伪指令,更确切的说存放的是将要执行指令的地址,它甚至可以是操作系统指令的本地地址,当虚拟机正在执行的方法是一个本地方法的时候,jvm的pc寄存器存储的值是undefined,所以你现在应该很明确的知道,虚拟机的pc寄存器是用于存放下一条将要执行的指令的地址(字节码流)。


这个图是要告诉你,当一个classLoder启动的时候,classLoader的生存地点在jvm中的堆,然后它会去主机硬盘上将A.class装载到jvm的方法区,方法区中的这个字节文件会被虚拟机拿来new A字节码(),然后在堆内存生成了一个A字节码的对象,然后A字节码这个内存文件有两个引用一个指向A的class对象,一个指向加载自己的classLoader
如下图。

 

 

本文转载自:http://blog.csdn.net/yfqnihao/article/details/8289363