《深入理解 Java 虚拟机》学习笔记 -- 内存区域
运行时数据区域
主要分为 6 部分:
- 程序计数器
- 虚拟机栈
- 本地方法栈
- Java 堆
- 方法区
如图所示:
程序计数器(线程私有)
- 程序计数器是当前线程所执行字节码的行号指示器
- 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
- 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器
- 执行 Java 方法,计数器记录的是正在执行的虚拟机字节码指令的地址;执行的是 Native 方法,计数器为空
- 程序计数器是唯一一个在 Java 虚拟机中不会出现
OutOfMemoryError
情况的区域
Java 虚拟机栈(线程私有)
- 每个方法被执行的时候都会同时创建一个栈帧
- 每一个方法被调用直至执行完成的过程,就对应者一个栈帧再虚拟机中从入栈到出战的过程
- ”栈内存“指的就是虚拟机栈中的局部变量表部分
- 局部变量表存放的是基本数据类型
- 局部变量表所需的内存空间再编译期间完成分配
StackOverflowError
: 线程请求的栈深度大于虚拟机所允许的深度OutOfMemoryError
: 虚拟机栈动态扩展无法申请到足够的内存
本地方法栈(线程私有)
- 运行本地方法
- 其他和 Java 虚拟机栈类似
Java 堆(线程共享)
- 在虚拟机启动时创建
- 存放对象实例
- 垃圾回收主要区域
方法区(线程共享)
- 存储已被虚拟机加载的类信息,常量,静态变量,即编译器编译后的代码等数据
- 对常量池的回收和对类型的卸载