JVM虚拟机复习
2021-04-04 00:24:07 1 举报
AI智能生成
参考书籍:深入理解JVM虚拟机第三版
作者其他创作
大纲/内容
运行时数据区
方法区
永久代
元空间
运行时常量池
字面量
符号引用
本地方法栈
虚拟机栈
栈针
局部变量表
操作数栈
动态链接
返回地址
程序计数器
堆
分代
新生代
Eden空间
2个Survivor空间
老年代
非分代
Region
直接内存
java对象
内存分配
指针碰撞
空闲列表
指针修改
CAS重试保证原子性
本地线程分配缓冲TLAB
对象的内存布局
对象头
MarkWord
01:未锁定,可偏向
无锁
偏向锁
00:轻量级锁定
10:重量级锁
11:GC标记
类型指针
实例数据
对齐填充
对象的访问定位
句柄
直接指针
性能监控和故障处理工具
命令工具
jps
jstat
jinfo
jmap
jstack
启动参数指定
-XX:PrintGCDetails
-XX:PrintHeapAtGC
-XX:PrintGCApplicationConcurrentTime
-XX:PrintGCApplicationStopTime
-XX:PrintAdaptiveSizePolicy
-XX:PrintTenuringDistribution
-XX:HeapDumpOnOutOfMemoryError
-XX:PrintSafepointStatistics
-XX:SafepointTimeout,-XX:SafepointTimeoutDelay=2000
可视化工具
JConsole
VisualVM
JMC
常见故障原因
堆大小不合理,设置太大导致每次回收的垃圾巨多,GC时间长,停顿时间长
堆外内存溢出
大对象,在年轻代来回复制,导致MinorGC时间长
线程卡住,无法进入安全点
垃圾收集原理
标记垃圾
引用计数法
可达性分析
GC root
虚拟机栈中引用的对象
静态属性应用的对象
常量引用的对象
本地方法栈Native中引用的对象
java虚拟机内部的引用
同步锁持有的对象
跨代引用
引用类型
强引用
软引用
弱引用
虚引用
finalize()
垃圾回收算法
标记-清除
1、标记需要清除的对象
2、清除对象
存在的问题
大量对象需要被标记然后清除,效率低
产生大量内存碎片
标记-复制
1、标记存活的对象
2、复制存活的对象到另一块区域
存在的问题
空间的浪费
剩余存活的对象不足以放入空闲空间,需要进行分配担保
标记-整理
1、标记存活的对象
2、将存活的对象移动到内存的一端
存在的问题
移动大量存活对象并更新引用比较耗时,Stop The World时间长
内存分配与回收策略
优先分配在Eden区
大对象直接进入老年代
长期存活的对象进入老年代
动态对象年龄判定
空间分配担保
1、MinorGC之前,先判断老年代空闲连续空间大小是否大于新生代所有对象占用空间
2、大于则直接进入老年代
3、小于则看是否允许担保,无担保直接FullGC,有担保则看历代晋升到老年代对象的大小是否小于老年代剩余空间,小于则MinorGC,否则FullGC
HotSpot算法细节
枚举跟节点
安全点
抢占式中断
主动式中断
安全区域
记忆集与卡表
写屏障
写前屏障
写后屏障
伪共享问题
并发可达性分析
存在的问题
消亡的对象标记为存活
存活的对象标记为消亡
解决方案
增量更新CMS
原始快照G1,Shenandoah
垃圾回收器
新生代垃圾回收器
Serial
ParNew
Parallel Scavenge
停顿时间设置-XX:MaxGCPauseMillis
吞吐量设置-XX:GCTimeRatio
自适应策略-XX:UseAdaptiveSizePolicy
老年代垃圾回收器
Serial Old
Parallel Old
CMS
处理过程
初始标记
并发标记
重新标记
并发清除
浮动垃圾
JDK5中老年代使用率达到68%触发GC
JDK6中老年代使用率达到92%触发GC
碎片空间
混合垃圾回收器
G1
区域划分
Region
Humongous
可预测停顿时间
双向卡表
并发标记引用变化处理方式
原始快照
两个TAMS指针
处理过程
初始标记
并发标记
最终标记
筛选回收
存在的问题
需要维护双向卡表,占用资源多,将写屏障操作异步进行
Shenandoah
区域划分同G1一致
连接矩阵
处理过程
初始标记
并发标记
最终标记
并发回收
初始引用更新
并发引用更新
最终引用更新
并发清理
读屏障
ZGC
区域划分
小型Region
中型Region
大型Region
染色指针
取引用指针可用来寻址的高4位来表示对象的状态
染色指针可以使得某个Region中的存活对象被移走后,这个Region立即就能释放
染色指针可以大幅减少垃圾收集过程中内存屏障的使用,因为指针维护了相关信息
染色指针可扩展性强,寻址地址中还有18位并为使用
地址多重映射,将多个不同的虚拟地址映射到同一个物理地址上,因为有4位拿来做其他标记,同一个物理地址的指针可能存在多种状态
处理过程
初始标记
并发标记
并发预备重分配
并发重分配
1、将重分配集中的对象复制到新的Region,并给每个重分配集中的Region维护一个转发表
2、访问时从指针上就可以判断是否要转发,由读屏障根据Region的转发表转发到新对象上
3、首次转发后,同时修改引用值,使指针指向新对象,称为指针的自愈能力
4、由于染色指针的存在,Region复制完成后就可以清除掉,后面访问通过转发表进行转发
并发重映射
0 条评论
下一页