目录
1运行时数据区域
1.1程序计数器
字节码指令的偏移地址
1.2Java虚拟机栈
1.3本地方法栈
和Java虚拟机栈相似,不过是用于Native方法。
在HotSpot中合二为一。
1.4Java堆
存放对象实例和数组
1.5方法区
1.5.1运行时常量池
1.6直接内存
2HotSpot虚拟机对象探秘
2.1对象的创建
- 加载:
- 分配内存:
分配方式:
线程安全性问题:
- 初始化:
- 对对象进行必要设置(设置对象头):
- <init>初始化
收敛顺序为
1. 父类变量初始化
2. 父类代码块
3. 父类构造函数
4. 子类变量初始化
5. 子类代码块
6. 子类构造函数
2.2对象的内存布局
- 对象头:Markword+类型指针
类型指针:
即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例。
- 实例数据
实例数据部分是对象真正存储的有效信息,也是在程序中所定义的各种类型的字段内容。
- 对其填充
对齐填充部分不是必然存在的,也没有什么特别的含义,仅仅起占位作用。 因为 Hotspot 虚拟机的自动内存管理系统要求对象起始地址必须是 8 字节的整数倍,换句话说就是对象的大小必须是 8 字节的整数倍。而对象头部分正好是 8 字节的倍数(1 倍或 2 倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。
2.3对象的访问定位
3实战:OutOfMemory异常
3.1Java堆溢出
3.2虚拟机栈和本地方法溢出
-Xoss 设置 本地方法栈大小(但在HotSpot虚拟机中不区分本地方法栈和虚拟机栈,故无效)
-Xss 设置虚拟机栈
3.3方法区和运行时常量池溢出
-XX:PermSize:表示非堆区初始内存分配大小
-XX:MaxPermSize:表示对非堆区分配的内存的最大上限
3.4本机直接内存溢出
-XX:MaxDirectMemorySize,若不指定和堆最大值一样