JVM HotSpot GC 整理
2017-11-21 14:16:08 75 举报
AI智能生成
登录查看完整内容
jvm hotspot gc
作者其他创作
大纲/内容
Hotspot GC
垃圾判断
引用计数
每次被引用,计数器加1
回收那些引用计数为0的对象
多个无用对象循环引用无法清除
可达性判断
每个对象初始化完成后放入GC Roots上
回收那些从GC Roots能遍历到,但是无法通过其他链返回GC Roots点的对象
目前主流的垃圾判断方式
清除垃圾过程
枚举根节点
准确式GC
通过OopMap存储Refrence及偏移量,避免全堆扫描
将Reference的时机称为Safe Point
SafePoint记录三个时间点
循环的末尾
方法临返回前/调用方法的call指令后
可能抛异常的位置
GC前需要停止所有的线程活动,通过2种方式中断所有活动线程
抢断式(不使用)
发生GC时中断所有线程,当发现某些线程不在安全点时,让他们运行至安全点
主动式
让线程轮询中断标识符,如果为真则进入中断状态。标识符轮询放在安全点之后判断
已经中断或休眠的线程处理方式
设置安全区域(Safe Region),GC时避开安全区域
当有线程引用了安全区域内的对象,标识为进入安全区域
离开安全区
如果已经GC完成,去除安全区域标识,继续运行
GC未完成,则进入等待状态,等待收到离开安全区域信号后再继续执行
二次判断
如果finalize已经被执行过,或者没有重写过,直接回收
并不保证执行完毕里面内容
在没有执行完或者阻塞后直接回收里面的对象
垃圾收集算法
标记-清除
先通过垃圾判断方式标记垃圾,然后直接清除到对应的垃圾
会导致内存碎片产生
复制
将内存空间平分为两块,直接将存活下来的对象,按顺序复制到另外一块内存空间中
容易造成内存空间浪费
但是由于hotspot只对survivor区进行平分,Eden区全部使用,所以内存使用比例达到90%,浪费不大
标记-整理
将垃圾进行清理,然后将幸存下来的对象按顺序复制到一个方向
使用方式
分代收集
在不同的分代中使用上述3个算法之一,更具有针对性
垃圾回收器
新生代
Serial
串行回收
对于Cpu资源较少,堆空间较小情况下使用效率比较高
能与CMS配合使用
使用复制算法
Parallel New
并行收集,适用于CPU 2+的环境下使用
Parallel Scavenge
目的是加大JVM吞吐量,而不是缩短停顿时间
吞吐量是用户线程运行时间/jvm运行总时间
可以有效控制最大停顿时间和吞吐量大小
可以自适应调节,对新生代老年代参数自动调整
达到设定回收时间限制设置
达到吞吐量设置
老年代
Serial Old
使用标记-整理算法
串行收集
Parallel Old
可以与Parallel Scavenge配合使用
并行收集
CMS(Concurrent Mark Sweep)
收集步骤
初始标记(initial mark)
stop the world
快速标记GC Roots能直接关联到的对象
单线程
并发标记(concurrent mark)
对GC Roots可达性进行遍历
与用户线程并发执行
并发
重新标记(remark)
修正在并发标记期间发生变化的一部分对象的记录
并发清除(Concurrent Sweep)
对需要收集的对象进行收集
优点
低停顿时间
缺点
CPU资源敏感
虽然在某些步骤不会暂停,但是在用户线程运行时还并发的执行GC,对用户线程吞吐量有一定影响
无法处理浮动垃圾(floating garbage)
浮动垃圾
在CMS执行并发清除的时候,用户线程运行,这时候产生的垃圾只有等待下一次GC才会被清理
会产生内存碎片
因为使用标记-清除算法所以会产生内存碎片
补救方法
可以通过设置参数,在每次或者指定次数的GC后的并发清理完成后进行碎片整理
不按分代
G1
结构
将堆划分为很多相同大小的独立区域(Region)
新生代,老年代概念保留
具体需要细化概念
回收算法
整体使用标记-整理
对Region做整理
局部使用复制算法
对Region内部进行复制算法
因为使用的算法,没有内存碎片
跟CMS对比不需要按间隔做内存整理
因为各个不同Region中的对象会存在相对引用关系,如果需要可达性扫描就需要全面扫描
如何避免全面扫描
在每个Region中添加Remembered Set
当虚拟机发现在对Reference类型数据进行写操作时
中断用户线程
检查写入的Reference引用的对象是否和引用在不同Region中
如果是在不同Region中,则将信息写入被引用对象Region的Remembered Set中
恢复用户线程
当进行GC时,通过在GC Roots加入Remembered Set就可以达到全引用扫描,又能避免全堆扫描
回收步骤
初始标记(Initial Mark)
类似于CMS的初始标记阶段
Stop the World
标记可以直接关联到的对象
修改TAMS(Next Top at Mark Start)
让下一阶段的在并发过程中,可以在正确可用的Region中创建新对象
耗时较短
并发标记(Concurrent Mark)
开始可达性分析
这个时间段用户线程操作的引用变化被写入Remembered Set Log
最终标记(Final Mark)
合并Remebered Set Log和Remebered Set
多线程
筛选回收(Live Data Counting And Evacuation)
Stop the Region World
对Region根据回收价值进行排序
根据用户配置的GC停顿时间,来制定需要回收的Region
优势
停顿时间低
停顿时间可预期
发布时间不长,未做大规模真实环境测试
服务器适用
为多线程,大内存控制所设计
0 条评论
回复 删除
下一页