JVM原理之JVM运行区域

来源:互联网 发布:js window.scroll 编辑:程序博客网 时间:2024/06/05 05:27

JVM运行时区域有PC寄存器、java栈、堆(heap)、方法区域(method area)、运行时常量池、本地方法堆栈

PC寄存器

pc寄存器中存放着JVM下一步要执行的指令,如果该方法为native,则pc寄存器不存储任何信息

JVM栈

JVM栈是线程私有的,每当创建一个线程都会申请一个栈,线程每执行一个方法都会在栈中申请一个栈帧,栈帧是由局部变量区域和操作数栈组成,局部变量区域存放着基本数据类型的变量,而引用类型只存储了指向堆的一个地址;操作数栈存放了程序执行的中间结果。

堆(heap)

通过new创建的对象实例都在堆中存储,Heap中的对象内存是通过GC(垃圾回收)进行回收,堆分为新生代和旧生代。新生代由分为Eden Space和Survivor Space,Survivor Space是由From space和To sapce组成。

                                   (图片来源http://blog.csdn.net/cutesource/article/details/5906705)

新生代:新创建的对象的是由新生代分配内存的,Eden内存空间不足的时候,将存活的对象转移到Survivor Space中,新生代的大小可以有-Xmn分配,也可以由-XX:SurvivorRatio控制Eden和Survivor的比例

旧生代:旧生代用来存放经过多次垃圾回收,还存货的对象。

堆在JVM中是被所有进程所共享的,所以在其上为对象分配内存的时候需要加锁,这样也导致了new对象的开销比较大。所以在新生代中Eden区域上有一块独立的内存空间TLAB(Thread Local Allocation Buffer)线程本地分配区域,在这个上面对对象分配内存的时候不需要进行加锁,这样JVM中分配内存的性能和C的效率差不多了,但是当new

的对象非常大的时候仍然需要直接使用堆空间进行分配,所以在java程序编写过程中,小对象一般比大对象更加高效。

方法区域(method area)

这块区域在JDK中叫做Permanent Space,又称持久化代,存放了所加载的类的信息(名称、修饰符等)、类中静态变量、类中final定义的常量、类中Field信息、类中方法信息,当通过类对象getName、isInterface等方法获取信息的时候,这些信息都是来自方法区域,同时方法区域业是被全局所共享的也会被GC,当方法区域所需要的内存超过的其规定的大小,会抛出OutOfMemory

本地方法栈(native method stack)

用来支持native的执行,存储这native方法的调用状态

运行常量池

他是位于方法区域的中的一块区域,用来存放类中固定的常量信息、方法、Field引用信息等


0 0