更深入的瞭解JAVA:內存結構---垃圾回收一主要記錄了收集器被觸發的條件,這是JVM性能調優的基礎。如果您想做到有的放矢或者遇到問題時更精準的把握問題,這些應該需要了解。
下面秉承上篇記錄一下垃圾收集器。
名稱 |
線程 |
新生代停頓 |
老年代停頓 |
老年代壓縮 |
FullGC次數 |
Seria |
單線程 |
是 |
是 |
Full GC時整理 |
多 |
Parallel |
多線程 |
是 |
是 |
Full GC時整理 |
多 |
CMS |
多線程 |
是 |
否 |
UseCMSCompactAtFullCollection |
少 |
G1 |
多線程 |
是 |
否 |
幾乎不產生碎片 |
最少 |
ParNew |
多線程 |
是 |
---- |
|
專注新生代 |
1.Serial收集器
單線程垃圾收集器、最基本、發展最悠久。它的單線程的意義並不僅僅說明它只會使用一個CPU或一條收集線程去完成垃圾收集工作,更重要的是在它進行垃圾收集時,必須暫停其他所有的工作線程,直到它收集結束。偶爾用在桌面應用中。
-XX:+UseSerialGC:設置串行收集器。
2.ParNew收集器
可多線程收集垃圾,收集新生代,使用收集算法
3.Parallel收集器
多線程收集垃圾,收集新生代,使用收集算法。Parallel收集器更關注系統的吞吐量,可以通過參數來打開自適應調節策略。
吞吐量:CPU用於運行用戶代碼的時間與CPU消耗的總時間的比值。
吞吐量 = (執行用戶代碼時間)/(執行用戶代碼時間+垃圾回收佔用時間)
-XX:+UseParallelGC:設置爲並行收集器。此配置僅對年輕代有效。即年輕代使用並行收集,而年老代仍使用串行收集。
-XX:ParallelGCThreads=20:配置並行收集器的線程數,即:同時有多少個線程一起進行垃圾回收。此值建議配置與CPU數目相等。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式爲並行收集。JDK6.0開始支持對年老代並行收集。
-XX:MaxGCPauseMillis=100:設置每次年輕代垃圾回收的最長時間(單位毫秒)。如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此時間。但最大停頓時間過短必然會導致新生代的內存大小變小,垃圾回收頻率變高,效率可能降低。
-XX:+UseAdaptiveSizePolicy:設置此選項後,並行收集器會自動調整年輕代Eden區大小和Survivor區大小的比例,以達成目標系統規定的最低響應時間或者收集頻率等指標。此參數建議在使用並行收集器時,一直打開。
-XX:CGTIMERatio 吞吐量大小(0-100),默認爲99。
4. CMS收集器
Concurrent Mark Sweep,採用標記-清除算法,用於老年代,常與ParNew協同工作。優點在於併發收集與低停頓。
注:並行是指同一時刻同時做多件事情,而併發是指同一時間間隔內做多件事情
初始標記
標記老年代中所有的GC Roots對象和年輕代中活着的對象引用到的老年代的對象,時間短;
併發標記
從“初始標記”階段標記的對象開始找出所有存活的對象;
重新標記
用來處理前一個階段因爲引用關係改變導致沒有標記到的存活對象,時間短;
併發清理
清除那些沒有標記的對象並且回收空間。
缺點:佔用大量的cpu資源、無法處理浮點垃圾、出現Concurrent MarkFailure、空間碎片。
-XX:+UseConcMarkSweepGC:即CMS收集,設置年老代爲併發收集。CMS收集是JDK1.4後期版本開始引入的新GC算法。它的主要適合場景是對響應時間的重要性需求大於對吞吐量的需求,能夠承受垃圾回收線程和應用線程共享CPU資源,並且應用中存在比較多的長生命週期對象。CMS收集的目標是儘量減少應用的暫停時間,減少Full GC發生的機率,利用和應用程序線程併發的垃圾回收線程來標記清除年老代內存。
-XX:+UseParNewGC:設置年輕代爲併發收集。可與CMS收集同時使用。JDK5.0以上,JVM會根據系統配置自行設置,所以無需再設置此參數。
-XX:CMSFullGCsBeforeCompaction=0:由於併發收集器不對內存空間進行壓縮和整理,所以運行一段時間並行收集以後會產生內存碎片,內存使用效率降低。此參數設置運行0次Full GC後對內存空間進行壓縮和整理,即每次Full GC後立刻開始壓縮和整理內存。
-XX:+UseCMSCompactAtFullCollection:打開內存空間的壓縮和整理,在Full GC後執行。可能會影響性能,但可以消除內存碎片。
-XX:+CMSIncrementalMode:設置爲增量收集模式。一般適用於單CPU情況。
-XX:CMSInitiatingOccupancyFraction=70:表示年老代內存空間使用到70%時就開始執行CMS收集,以確保年老代有足夠的空間接納來自年輕代的對象,避免Full GC的發生。
5. G1收集器
G1(Garbage First)垃圾收集器是當今垃圾回收技術最前沿的成果之一,早在JDK7就已加入JVM的收集器大家庭中,成爲HotSpot重點發展的垃圾回收技術。
優勢:並行(多核CPU)與併發;
分代收集(新生代和老年代區分不明顯);
空間整合;
限制收集範圍,可預測的停頓。
步驟:初始標記、併發標記、最終標記和篩選回收。
I global concurrent marking (全局併發標記)
II Initial marking phase:標記GC Root,STW
III Root region scanning phase:標記存活Region
IV Concurrent marking phase:標記存活的對象
V Remark phase :重新標記,STW
VI Cleanup phase:部分STW
-XX:+UseG1GC 開啓G1
-XX:G1HeapRegionSize=n,region的大小,1-32M,2048個
-XX:MaxGCPauseMillis=200 最大停頓時間
-XX:G1NewSizePercent -XX:G1MaxNewSizePercent
-XX:G1ReservePercent=10 保留防止to space溢出()
-XX:ParallelGCThreads=n SWT線程數(停止應用程序)
-XX:ConcGCThreads=n 併發線程數=1/4*並行