一、GC评估指标
二、垃圾回收器
面试题
Serial GC
ParNew GC
Paraller Old
CMS
问题
CMS是内存不够才能进行垃圾回收吗?
答:不是,由于CMS是并发进行垃圾回收的,如果当内存不够时再进行垃圾回收,此时用户线程仍然再产生垃圾,很容易报错OOM,所以我们需要手动的设置一个阈值,当老年代内存达到这个阈值的时候就可以进行垃圾回收
为什么不使用标记-压缩算法进行垃圾回收
答:原因也是因为CMS是并发进行垃圾回收的,如果使用标记压缩算法,那么会移动堆中的数据,造成用户线程无法找到对象位置
G1
在延迟可控的情况下尽可能高的提高吞吐量,使用场景:内存较大、多个处理器
Young GC
- 初始标记:标记GC Roots直接引用的对象,速度很快
- 更新&处理RSet:更新并处理RSet,将年轻代中被老年代所引用的对象添加的GC Roots中
- 复制对象:使用标记-复制算法,将标记的存活对象往空的survivor区或老年代中放,并清除其它eden区域
Mixed GC
- 初始标记:执行Young GC,并复用Young GC的初始标记
- 并发标记:该过程和用户线程同时执行,根据GC Roots往下追溯,查找整个堆的存活对象,比较耗时
- 重标记:根据原始快照,将并发标记中发生改变的旧引用记录下来,将其添加到GC Roots中
- 清理:根据region中存活对象的比例从小到大排列,再根据设置的垃圾回收时间得到回收region的数量,清理排名靠前的region
注意:原始快照能够保证不因为引用变化出现对象消息的问题,但是它不会处理那些变成垃圾的存活对象,存在浮动垃圾
Full GC
当混合回收的速度跟不上垃圾产生的速度的时候触发Full GC,使用serial old进行垃圾回收