05-JVM-垃圾回收器

一、GC评估指标

05-JVM-垃圾回收器_第1张图片

二、垃圾回收器

05-JVM-垃圾回收器_第2张图片
面试题
05-JVM-垃圾回收器_第3张图片

Serial GC

05-JVM-垃圾回收器_第4张图片

ParNew GC

05-JVM-垃圾回收器_第5张图片

Paraller Old

05-JVM-垃圾回收器_第6张图片
05-JVM-垃圾回收器_第7张图片

CMS

05-JVM-垃圾回收器_第8张图片
05-JVM-垃圾回收器_第9张图片

问题

CMS是内存不够才能进行垃圾回收吗?
答:不是,由于CMS是并发进行垃圾回收的,如果当内存不够时再进行垃圾回收,此时用户线程仍然再产生垃圾,很容易报错OOM,所以我们需要手动的设置一个阈值,当老年代内存达到这个阈值的时候就可以进行垃圾回收

为什么不使用标记-压缩算法进行垃圾回收
答:原因也是因为CMS是并发进行垃圾回收的,如果使用标记压缩算法,那么会移动堆中的数据,造成用户线程无法找到对象位置

G1

在延迟可控的情况下尽可能高的提高吞吐量,使用场景:内存较大、多个处理器

05-JVM-垃圾回收器_第10张图片
05-JVM-垃圾回收器_第11张图片
05-JVM-垃圾回收器_第12张图片
05-JVM-垃圾回收器_第13张图片

Young GC

  1. 初始标记:标记GC Roots直接引用的对象,速度很快
  2. 更新&处理RSet:更新并处理RSet,将年轻代中被老年代所引用的对象添加的GC Roots中
  3. 复制对象:使用标记-复制算法,将标记的存活对象往空的survivor区或老年代中放,并清除其它eden区域

Mixed GC

  1. 初始标记:执行Young GC,并复用Young GC的初始标记
  2. 并发标记:该过程和用户线程同时执行,根据GC Roots往下追溯,查找整个堆的存活对象,比较耗时
  3. 重标记:根据原始快照,将并发标记中发生改变的旧引用记录下来,将其添加到GC Roots中
  4. 清理:根据region中存活对象的比例从小到大排列,再根据设置的垃圾回收时间得到回收region的数量,清理排名靠前的region

注意:原始快照能够保证不因为引用变化出现对象消息的问题,但是它不会处理那些变成垃圾的存活对象,存在浮动垃圾

Full GC

当混合回收的速度跟不上垃圾产生的速度的时候触发Full GC,使用serial old进行垃圾回收

GC日志分析

05-JVM-垃圾回收器_第14张图片

JVM监控及诊断-命令行篇

面试题

05-JVM-垃圾回收器_第15张图片

常见命令

05-JVM-垃圾回收器_第16张图片

你可能感兴趣的:(jvm,jvm,java,面试)