今天开始看了些Java虚拟机的资料,做了一下小结笔记,希望大家多提宝贵意见,谢谢。
一、Java虚拟机运行时数据区域
-
程序计数器
-
Java虚拟机栈
-
本地方法栈
-
Java堆
-
方法区
-
运行时常量池
二、各数据区域情况
1、程序计数器
(1)当前线程所执行字节码的行号指示器。
(2)各线程计数器互不影响,独立存储。
(3)是线程私有内存。
(4)唯一没有规定OutOfMemoryError情况的区域。
2、Java虚拟机栈
- (1)线程私有。
- (2)生命周期与线程相同。
- (补充) 主要包括:局部变量表、操作数栈(存放计算过程的中间结果)和帧数据区(包含访问常量池的指针和异常处理表)
- (3)描述了Java方法执行的内存模型
即Java方法在执行时创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。
- (4)栈内存指的就是虚拟机栈,或是虚拟机栈中的局部变量表。
局部变量表:存放了各种基本数据类型、对象引用和returnAddress类型。
局部变量变量表所需内存在编译时完成分配。
- (5)异常
StackOverflowException 和 OutOfMemoryException
3、本地方法栈
- (1)与java虚拟机栈非常相似
- (2)相比java虚拟机栈的区别:
虚拟机栈是为虚拟机执行的java方法(字节码)服务;
本地方法栈是为虚拟机使用到的Native(本地)方法服务。
4、Java堆
- (1)被所有线程共享。
- (2)几乎所有对象实例都在这里分配。
- (3)是垃圾收集器管理的主要区域,也称为GC堆(分代收集算法)。
- (4)Java堆可以处于物理上不连续的内存空间中,只需要逻辑上是连续的即可。
5、方法区
- (1)被所有线程共享。
- (2)用于存储已被虚拟机加载的类信息、常量、静态变量和及时编译器编译后的代码等数据
- (3)对于习惯在HotSpot虚拟机上开发的开发者来说,喜欢把方法区称为“永久代”.
- (4)不需要连续的内存;可以选择固定的大小和可扩展;可以选择不实现垃圾收集。
- (5)该区域收集的目标:
常量池的回收 和 对类型的卸载。
6、运行时常量池
- (1)是方法区的一部分。
- (2)存放:
a. Class文件中描述的符号引用。
b. 翻译出来的直接引用。
- (3)重要特征:具备动态性。
即运行期也能将新的常量放入池中,比如String类的intern()方法。