1.GC的分類
JVM在進行GC時,可能針對三個區域進行垃圾回收分別是新生代、老年代、方法區,大部分時候回收的都是新生代。GC類型主要有以下四種類型。
- 新生代收集(Minor GC/Young GC):只針對新生代的垃圾收集。具體點的是Eden區滿時觸發GC。 Survivor滿不會觸發Minor GC 。
- 老年代收集(Major GC/Old GC):只針對 老年代的垃圾收集。 目前,只有CMS收集器會有單獨收集老年代的行為。
- 混合收集(Mixed GC):指目標是收集整個新生代以及部分老年代的垃圾收集。 目前只有G1收集器會有這種行為。
- 整堆收集(Full GC):收集整個Java堆和方法區的垃圾收集。
2.1MinorGC
當年輕代(Eden區)滿時就會觸發 Minor GC,這里的年輕代滿指的是 Eden區滿。Survivor 滿不會觸發 Minor GC 。對於大部分應用程序,Minor GC 操作時應用程序停頓導致的延遲都是可以忽略不計的。大部分 Eden 區中的對象都能被認為是垃圾,永遠也不會被復制到 Survivor 區或者老年代空間。如果正好相反,Eden 區大部分新生對象不符合 GC 條件,Minor GC 執行時暫停的時間將會長很多。
2.2MajorGC
當老年代滿時會觸發MajorGC,只有CMS收集器會有單獨收集老年代的行為,其他收集器均無此行為。而針對新生代的MinorGC,各個收集器均支持。總之,單獨發生收集行為的只有新生代,除了CMS收集器,都不支持單獨回收老年代。
2.3FullGC
FullGC是針對新生代,老年代和方法區(元空間)的垃圾收集。FullGC產生的條件:
(1)調用System.gc時,系統建議執行Full GC,但是不一定會執行 。
(2)老年代空間不足。
(3)方法區空間不足,類卸載(類卸載三個條件)。
(4)通過 Minor GC 后進入老年代的空間大於老年代的可用內存
(5)內存空間擔保。