JVM运行时数据区域都放了什么?
-
程序计数器
- 线程私有的,用于确定当前线程执行到哪条指令了,当cpu调度到某个线程的时候就是根据程序计数器来确定执行哪条指令。
-
虚拟机栈
- 描述Java方法执行的线程内存模型,每个方法执行的时候,Java虚拟机都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。局部变量表存放了各种Java虚拟机的基本数据类型,以及引用数据类型的引用。当方法调用的数量超过栈深度之后会报StackOverFlowError。
-
本地方法栈
- 本地方法栈和虚拟机栈的区别就是本地方法栈描述的是本地方法执行的线程内存模型
-
Java堆
- 堆是线程共享的区域。它是虚拟机管理的内存中最大的一块,机会所有的对象创建之后都放在堆中,所以也是垃圾回收管理的主要区域。
-
方法区
- 方法区也是线程共享的区域。用于存放已经被虚拟机加载的类型信息,常量,静态变量,即时编译器编译后的代码缓存等。它还有个别名“非堆”,垃圾收集也会在这个区域出现,主要是针对常量池的回收也类型的卸载。jdk8之前用永久代来实现方法区,jdk8之后废除永久代,改为元空间,元空间是在本地内存中。
-
运行时常量池
- 运行时常量池是方法区的一部分,用于存放编译器生成的各种字面量和符号引用,运行期间也可以将新的常量放入运行时常量池中,如String类的intern()方法。
ng类的intern()方法。 - 字面量:String x = “abc” 就是把字面量“abc”赋值给变量x。
参考资料《深入理解Java虚拟机》
- 运行时常量池是方法区的一部分,用于存放编译器生成的各种字面量和符号引用,运行期间也可以将新的常量放入运行时常量池中,如String类的intern()方法。