JVM运行时数据区
-
程序计数器 Program Counter Register
程序计数器是用于存储每个线程下一步将执行的JVM指令,如该方法为native,则程序计数器不存储任何信息。
-
JVM栈 JVM Stack
JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量、部分返回的结果以及Stack Frame,非基本类型的对象在栈上存放一个指向堆的地址
-
堆 heap
JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象会等待GC回收
堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,所以在new对象的时候会有较大的内存开销。
-
方法区 Method Area
Sun JDK中这块区域对应的为PermanentGeneration,有称为持久代
方法区存放了所加载的类信息包括名称、修饰符、类中的静态变量、类中定义为final类型的常量、类中的Field、方法。
当通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区,同时方法区也是全局共享的,在一定条件下也会被垃圾回收,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误。
-
本地方法栈 Native Method Stacks
JVM采用本地方法栈来支持本地方法的执行,此区域存储每个native方法调用的状态。
-
运行时常量池 Runtime Constant Pool
存放的为类中固定的常量信息、方法和属性的引用信息等。
是从方法区中分配出来的空间。
JVM在加载类时会为每个class分配一个独立的常量池,运行时字符串常量池是全局共享的。
JVM结构示意图
![](https://img.haomeiwen.com/i5794459/2219920e254b1528.jpg)
网友评论