JVM学习笔记(一)—— 运行时数据区

运行时数据区:

JVM学习笔记(一)—— 运行时数据区

1.程序计数器(线程私有)

当前线程的所执行字节码的行号指示器,

字节码解释器工作时通过改变计数器的值选择下一条需要执行的字节码指令。

java虚拟机的多线程通过轮流切换分配处理器(对于多核处理器来说是一个内核)执行时间来实现,一个时刻,一个处理器只会执行一条线程。
为了保证线程切换后能恢复正确的位置,因此每个线程都有一个独立的程序计数器。

线程执行 java 方法时计数器记录正在执行的虚拟机字节码指令的地址;

线程执行 native 方法时计数器值为空;

2.虚拟机栈(线程私有)

a. 生命周期与线程相同

b.描述java方法执行的内存模型:方法执行时创建一个栈帧存储局部变量表,操作数栈,动态链接,

方法出口等信息。方法调用的完成对应着栈帧的入栈到出栈

局部变量表:存放编译器可知的基本类型数据,对象引用和 returnAddress 类型(指向一条字节码指令的地址)

局部变量表所需空间在编译期间完成分配,方法运行期间不会改变其大小。

3.本地方法栈(线程私有)


为Native 方法服务。

4.Java堆

新生代+老年代 (内存回收采用分代收集 )
新生代:Eden + From Survivor + To Survivor ( 8:1:1 )

5.方法区(线程共享,堆的一个逻辑部分)


a. 存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

b. HotSpot 使用永久代实现方法区,JDK1.7 将永久代的字符串常量池移出。

c. 此区域的垃圾回收主要针对常量池的回收和类型的卸载。

6.运行时常量池(方法区的一部分)


a. 存储编译期间生成的字面量 符号引用,这部分内容在类加载后进入方法区的运行时常量池;

b. 具备动态性,运行期间也可将新的常量放入池中;比如String 的 intern() 

c. 受方法区内存限制


符号引用:一组用来描述引用的目标的符号;

直接引用:

直接指向目标的指针(指向Class 对象,类变量,类方法的直接引用,也可能是指向方法区的指针);

相对偏移量(指向实例变量,实例方法的直接引用);

一个能定位到目标的句柄。