文章目录
1. JVM的简化架构
1.1 运行时数据区
- PC寄存器就是程序基数器
1. 程序计数器
2. 虚拟机栈
3. 堆
4. 方法区
5. 运行时常量池
6. 本地方法栈
1.2 栈、堆、方法区交互关系
2. 堆内存
2.1 堆内存概述
2.2 堆的结构
2.3 对象的内存布局
2.4 对象的访问定位
1. 使用句柄
- 优点:
对象实例改变时,只需要改变句柄中的实例对象的指针,不改变引用指针 - 缺点:
间接引用,速度会慢些
2. 使用指针
- 是HotSpot默认的实现
- 优点是直接引用,速度高
3. 内存分配参数
3.1 Trace跟踪参数
3.2 GC日志格式
3.3 Java堆的参数
Xms, Xmx
Xmn
-
新new出的对象都在新生代
-
G1收集器,不建议设置大小,而是由虚拟机自动分配
-
为了方便观察分代使用效果,将收集器切换回
CMS
收集器
-
设置类对象的大小为
1M
,循环创建实例,直到内存溢出
3.3 堆参数
1. OOM时导出堆到文件
- 使用MAT工具插件查看报告文件
- 指定日志储存位置
2. 老年代与新生代的比值
3. Eden区和Survivor区的大小比值
4. 直接将对象分配到老年代案例
- 当类文件较大,比如新生代设置为2M,不够容纳创建的类的实例,会直接放进老年代
3.4 Java栈的参数
3.5 元空间的参数