原創轉載請注明出處:https://www.cnblogs.com/agilestyle/p/11488036.html
Minor GC 清理年輕代
Minor GC指新生代GC,即發生在新生代(包括Eden區和Survivor區)的垃圾回收操作,當新生代無法為新生對象分配內存空間的時候,會觸發Minor GC。因為新生代中大多數對象的生命周期都很短,所以發生Minor GC的頻率很高,雖然它會觸發stop-the-world,但是它的回收速度很快。
Major GC 清理老年代
Major GC清理Tenured區,用於回收老年代,出現Major GC通常會出現至少一次Minor GC。
Full GC 清理整個堆空間—包括年輕代、老年代、元空間
Full GC是針對整個新生代、老生代、元空間(metaspace,java8以上版本取代perm gen)的全局范圍的GC。Full GC不等於Major GC,也不等於Minor GC+Major GC,發生Full GC需要看使用了什么垃圾收集器組合,才能解釋是什么樣的垃圾回收。
Note
不管什么GC,都會發生stop-the-world,區別是發⽣的時間長短。⽽這個時間跟垃圾收集器又有關系,Serial、PartNew、Parallel Scavenge收集器⽆論是串⾏還是並⾏,都會掛起⽤戶線程,⽽CMS和G1在並發標記時,是不會掛起⽤戶線程的,但其它時候⼀樣會掛起⽤戶線程,STW 的時間相對來說就小很多了。
Major GC 在很多參考資料中是等價於 Full GC的,我們也可以發現很多性能監測工具中只有Minor GC 和 Full GC。
⼀般情況下,⼀次Full GC將會對年輕代、⽼年代、元空間以及堆外內存進⾏垃圾回收。
觸發Full GC的原因有很多:
- 當年輕代晉升到⽼年代的對象⼤⼩,並⽐⽬前⽼年代剩余的空間⼤⼩還要⼤時,會觸發Full GC;
- 當⽼年代的空間使⽤率超過某閾值時,會觸發Full GC;
- 當元空間不⾜時(JDK1.7永久代不足),也會觸發Full GC;
- 當調⽤System.gc()也會安排⼀次Full GC。
Reference
https://plumbr.io/blog/garbage-collection/minor-gc-vs-major-gc-vs-full-gc
https://time.geekbang.org/column/article/109201
