Java虚拟机运行时数据区

JVM 运行时数据区:
*  程序计数器:
    可以看作是当前线程所执行的字节码的行号指示器。线程私有的,各条线程之间的计数器互不影响,独立存储。

* Java虚拟机栈:
    虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时,会创建一个叫“栈帧”的数据结构,栈帧包括局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

* 本地方法栈:

    本地方法栈与虚拟机栈所发挥的作用是非常相似的,他们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。虚拟机规范中对本地方法栈中方法使用的语言、使用方式、与数据结构并没有强制规定,因此具体的虚拟机可以*实现它。Sun的HotSpot虚拟机直接把本地方法栈和虚拟机栈合二为一。

* Java堆:

    Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java堆是垃圾收集器管理的主要区域。

* 方法区:

    方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。HotSpot虚拟机将方法区称为“永久代”,本质上两者并不等价,仅仅是因为HotSpot虚拟机的设计团队选择把GC分代收集扩展至方法区,或者说使用永久代来实现方法区而已,这样HotSpot的垃圾收集器可以像管理Java堆一样管理这部分内存,能够省去专门为方法区编写内存管理代码的工作。对于其他虚拟机(如IBM J9、BEA JRockit等)来说是不存在永久代的概念的。

    运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。不仅仅只是Class文件常量池的内容会存放到运行时常量池,运行期间产生的常量也会放入池中(例如:String类的intern()方法)。

 

最后配张图:

Java虚拟机运行时数据区
Java虚拟机运行时数据区

 

转载自《深入理解Java虚拟机》