瞎掰JVM:內存結構---垃圾回收(二)

更深入的瞭解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*並行
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章