0%

JVM内存区域

JVM内存区域

Java程序在运行过程中会在内存中生成对象、常量等各种数据,JVM为了方便管理这些数据对内存中的数据进行了区域划分。

JVM规范中定义的内存区域有:

程序计数器、虚拟机栈、本地方方法栈、方法区、堆。

程序计数器

在Java多线程执行中cpu会为多线程分配执行时间片段,当某个线程被挂起时需要记录当前线程执行的位置,以便在恢复时继续执行。这就是程序计数器的作用

JVM规范中没有对程序计数器定义OutOfMemory之类的异常

程序计数器是线程私有的,生命周期同线程一样

如果线程执行的是Java方法代码实际上记录的是当前执行的class字节码指令的地址

如果是是native方法记录会为空(undefined)

虚拟机栈

虚拟机栈是用来描述Java方法执行的内存模型,每个Java方法在执行时JVM都会在虚拟机栈中创建一个栈帧

栈帧包含:

局部常量表、操作数栈、动态链接、返回地址

JVM规范定义虚拟机栈的异常有:OutofMemoryError、StackOverFlowError

虚拟机栈是线程私有的,生命周期同线程一样

局部常量表:保存方法局部变量

操作数栈:对常量表中的数据进行算术运算

动态链接:方法调用时的方法符号转化为方法所在内存中地址的直接引用

返回地址:方法执行完后要返回的代码位置

本地方法栈

本地方方法栈是针对于native方法的栈与虚拟机栈类似

本地方法栈是线程私有,生命周期同线程一样

方法区

方法区存储的是被JVM加载过的类信息、常量、静态变量、及时编译器编译过的代码和数据

方法区数据是线程共享

方法区是JVM规范,永久代和元空间是方法区的具体实现

堆存放的数据是Java程序运行时产生的对象实例

JVM规范定义的堆的异常有:OutOfMemoryError

堆数据是线程共享的