Minor GC Major GC Full GC 的区别
Minor GC 故名思意 是年轻代GC 。
我们可以认为Major GC == Full GC,他们是一个概念,就是针对老年代/永久代进行GC。
因为取名叫Full就会让人疑惑,到底会不会先Minor GC。
事实上Full GC本身不会先进行Minor GC,我们可以配置,让Full GC之前先进行一次Minor GC,因为老年代很多对象都会引用到新生代的对象,先进行一次Minor GC可以提高老年代GC的速度。
比如老年代使用CMS(并发标记清除法)时,设置CMSScavengeBeforeRemark优化,让CMS remark之前先进行一次Minor GC。
弄清楚了Full GC本意单纯就是针对老年代了之后,我们再进一步深入理解Full GC的含义。因为CMS主要可以分为
initial mark(stop the world),
concurrent mark,
remark(stop the world),
concurrent sweep
几个阶段,其中initial mark和remark会stop the world。
这里的定义是另外一种解释:
- Full GC == Major GC指的是对老年代/永久代的stop the world的GC
- Full GC的次数 = 老年代GC时 stop the world的次数
- Full GC的时间 = 老年代GC时 stop the world的总时间
- CMS 不等于Full GC,我们可以看到CMS分为多个阶段,只有stop the world的阶段被计算到了Full GC的次数和时间,而和业务线程并发的GC的次数和时间则不被认为是Full GC。
- Full GC本身不会先进行Minor GC,我们可以配置,让Full GC之前先进行一次Minor GC,因为老年代很多对象都会引用到新生代的对象,先进行一次Minor GC可以提高老年代GC的速度。比如老年代使用CMS时,设置CMSScavengeBeforeRemark优化,让CMS remark之前先进行一次Minor GC。
总的来讲:
一种是简单的想法就把MajorGC与FullGC划等号。
一种FullGC指的是MajorGC中stop the world 时的那个的GC。