垃圾回收器學習之Full GC和CMS GC的區別
Parallel Scavenge(-XX:+UseParallelGC)框架下,預設是在要觸發full GC前先執行一次young GC,並且兩次GC之間能讓應用程式稍微執行一小下,以期降低full GC的暫停時間(因為young GC會盡量清理了young gen的死物件,減少了full GC的工作量)。併發GC的觸發條件就不太一樣。以CMS GC為例,它主要是定時去檢查old gen的使用量,當使用量超過了觸發比例就會啟動一次CMS GC,對old gen做併發收集。併發並行垃圾回收器在觸發full gc之前都會先觸發一下young垃圾回收,這個可以根據引數進行配置。而序列垃圾回收的full gc預設就是老年代回收。
-
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。CMS主要可以分為initial mark(stop the world), concurrent mark, remark(stop the world), concurrent sweep幾個階段,其中initial mark和remark會stop the world
-
Full GC本身不會先進行Minor GC,我們可以配置,讓Full GC之前先進行一次Minor GC,因為老年代很多物件都會引用到新生代的物件,先進行一次Minor GC可以提高老年代GC的速度。比如老年代使用CMS時,設定CMSScavengeBeforeRemark優化,讓CMS remark之前先進行一次Minor GC。
本文來自部落格園,作者:up~up,轉載請註明原文連結:https://www.cnblogs.com/soft-engineer/p/15095406.html