CMS收集器 Concurrent Markup Sweep 並發標記清除
使用了標記-清除算法 與標記-壓縮相比,並發階段會降低吞吐量
算法作用在老年代以及永久區(新生代使用ParNew)
-XX:+UseConcMarkSweepGC
CMS運行過程
1.初始標記(用戶線程停止)
根可以關聯到的對象
速度快
2.並發標記(和用戶線程一起)
主要標記過程,標記全部對象
3.重新標記(用戶線程停止)
由於並發標記時,用戶線程依然進行因此在正式清理前,再做修正。
4.並發清除(和用戶線程一起)
基於標記結果,直接清理對象
特點:
1.盡可能降低停頓
2.會影響系統整體吞吐量和性能
比如,在用戶線程運行過程中,分一半CPU去做CMS GC,系統性能在GC階段,反應速度就下降一半。
3.清理不徹底。
在清理階段,用戶線程還在執行,會產生新的垃圾,無法清理。
4.因為和用戶線程一起執行,不能在空間將滿時再清理。
-XX:CMSInitiatingOccupancyFraction設置觸發GC的閾值。 設定老年代空間被使用多少后觸發。
如果不幸內存預留空間不足,就會引起concurrent mode failure.
5.在CMS遇到空間不足時,可以使用串行收集器作為后備。
6.做標記清除時,可以不停止應用線程,但會產生內存碎片,而做標記壓縮時,會Stop-The-World,但不會產生內存碎片。
-XX:+UseCMSCompactAtFullCollection Full GC后,進行一次碎片整理。
整理過程是獨占的,會引起停頓時間變長。
減輕GC壓力 軟件如何架構,代碼如何寫,堆空間如何分配。
1.性能的根本在應用。
2.GC參數屬於微調。
3.GC參數設置不合理,會影響性能,產生大的延時。