总结一下jvm的运行时数据区域Runtime Data Areas

   当运行一个JVM实例时,系统将分配给这个实例一块内存区域(由jvm自己管理)。从这一块内存中分出一块用来存储一些运行数据,例如创建的对象,传递给方法的参数,局部变量,返回值等等。分出来的这一块就称为Runtime Data Areas

     Runtime Data Areas可以划分为6大块:Java栈、程序计数寄存器(PC寄存器)、本地方法栈(Native Method Stack)、Java堆、方法区域、运行常量池:

由上图可知,程序计数器、java栈、本地方法栈是每个线程所独有的,而方法区域、、java堆、运行时常量池则是线程共享的区域。

1、java栈:

       每当一个方法被调用时,jvm就往java栈里面压入一个栈帧,栈帧结构如下

     

   栈帧包含3个部分:局部变量数组、操作数栈、方法所属类的常量池引用。

   局部变量数组:依次存放方法所属对象的引用this、形参、局部变量等(对于静态方法没有this,所以这里不会存对象的引用)

   操作数栈:存放执行时有一些中间变量,在执行方法时候,压入或弹出这些变量,操作数栈是方法真正工作的地方。

   常量池引用:当jvm执行某个方法时需要用到常量,就会利用常量的引用去访问常量池

   如果方法通过return返回,则将该方法所属的栈帧从java栈里面弹出,如果return有返回值,则将返回值压入调用该方法的操作数栈中

2、本地方法栈:通过调用本地方法来完成某些功能

3、方法区域:属于共享区域。在方法区域内,存放类的字节码和方法的信息等

4、java堆:属于共享区域。堆中存放的是程序创建的对象或者实例,这一块对jvm的性能影响很大,垃圾回收机制就是在这个区域工作的。

5、常量池:属于共享区域。存放类和接口以及方法和域的所有引用,当一个方法被引用时,jvm通过常量池中的应用来查找内存中实际引用的地址。