JVM复习 —— 内存区域
JVM 内存结构
Java 虚拟机的内存空间分为 5 个部分:
- 程序计数器
- Java 虚拟机栈
- 本地方法栈
- 堆
- 方法区
程序计数器(PC)
为什么需要程序计数器
因为Java虚拟机的多线程是通过线程轮流切换
并分配处理器执行时间
的方式来实现的。任意时刻,一个处理器只执行一条指令,为了进程切换后恢复到正确的执行位置,所以才有了程序计数器
作用
记录当前线程的执行字节码的位置,线程私有,也就是每个线程都有一个单独的计数器来记录。
特点
- 不会发生OutOfMemoryError
- 执行Native方法,计数器值为空
- 线程私有
Java虚拟机栈
定义
描述Java方法执行的内存模型。
方法在执行的时候会创建一个栈帧,方法的调用到完成,对应着栈帧
在虚拟机栈中入栈
到出栈
的过程。
一个线程的方法调用可能很长,很多方法都处于执行状态。对于执行引擎来说,只有处于栈顶的栈帧(当前栈帧
)才有效,与之相关联的方法是当前方法
。
栈帧用于存储局部变量表
、操作数栈
、动态链接
、方法出口
等信息。
局部变量表
局部变量表存放编译期可知的基本数据类型
、对象引用
和return Address类型
局部变量表所需要的内存空间在编译期间完成分配。
特点
- 线程私有
- 线程请求的栈深度大于JVM允许深度,抛出
*Error
异常 - 虚拟机栈动态扩展时,无法申请足够的内存,抛出
OutOfMemoryError
异常
本地方法栈
堆
堆的定义
用来存放对象的内存空间,几乎所有的对象都存储在堆中。
堆的特点
- 线程共享
- 垃圾回收的主要场所
方法区
方法区的定义
运行时常量池
相关参数
参考文档
《深入理解Java虚拟机》
深入理解Java虚拟机(JVM性能调优+内存模型+虚拟机原理)