JVM的内存区域划分
- 堆
- Java虚拟机栈
- 程序计数器
- 方法区
- 运行时常量池
堆
程序中创建的所有对象都保存在堆中
Java虚拟机栈
Java虚拟机栈的生命周期和线程相同,描述的是Java方法执行的内存模型,每个方法在执行的时候都会同时创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法返回地址等信息
递归存放着方法的调用关系
程序计数器
用来记录当前线程执行的行号,记录的当前线程执行的下一条指令的内存地址
如果当前线程正在执行的是一个Java方法,这个计数器记录是正在执行的虚拟机字节码指令的地址如果正在执行的是一个native方法,这个计数器值为空
程序计数器的内存区域是唯一一个在jvm中没有规定任何oom情况的区域
方法区
用来存储虚拟机加载的类信息,常量,静态变量,即时编译器后的代码等数据
JDK7时此区域叫做永久代,JDK8中叫元空间
存放类(.class文件)被加载到内存后放的地方,类对象,类方法的内容 static修饰的
运行时常量池
运行时常量池是方法的一部分,存放字面量和符号引用
字面量:字符串(JDK8之后 移动到堆中) final常量 基本数据类型的值
符号引用: 类和结构的完全限定名,字段的名称和描述符,方法的名称和描述符