當前位置:
首頁 > 知識 > JVM GC參數以及GC演算法的應用

JVM GC參數以及GC演算法的應用

1. 串列收集器

串列收集器是最古老,最穩定以及效率高的收集器

可能會產生較長的停頓,只使用一個線程去回收

-XX:+UseSerialGC

新生代、老年代使用串列回收

新生代複製演算法

老年代標記-壓縮

串列收集器的日誌輸出:

2.1 ParNew2. 並行收集器

-XX:+UseParNewGC(new代表新生代,所以適用於新生代)

新生代並行

老年代串列

Serial收集器新生代的並行版本

在新生代回收時使用複製演算法

多線程,需要多核支持

-XX:ParallelGCThreads 限制線程數量

並行收集器的日誌輸出:

類似ParNew2.2 Parallel收集器

新生代複製演算法

老年代標記-壓縮

更加關注吞吐量

-XX:+UseParallelGC

使用Parallel收集器+ 老年代串列

-XX:+UseParallelOldGC

使用Parallel收集器+ 老年代並行

Parallel收集器的日誌輸出:

-XX:MaxGCPauseMills2.3 其他GC參數

最大停頓時間,單位毫秒

GC儘力保證回收時間不超過設定值

-XX:GCTimeRatio

0-100的取值範圍

垃圾收集時間佔總時間的比

默認99,即最大允許1%時間做GC

這兩個參數是矛盾的。因為停頓時間和吞吐量不可能同時調優

3. CMS收集器

Concurrent Mark Sweep 並發標記清除(應用程序線程和GC線程交替執行)

使用標記-清除演算法

並發階段會降低吞吐量(停頓時間減少,吞吐量降低)

老年代收集器(新生代使用ParNew)

-XX:+UseConcMarkSweepGC

CMS運行過程比較複雜,著重實現了標記的過程,可分為

1. 初始標記(會產生全局停頓)

根可以直接關聯到的對象

速度快

2. 並發標記(和用戶線程一起)

主要標記過程,標記全部對象

3. 重新標記 (會產生全局停頓)

由於並發標記時,用戶線程依然運行,因此在正式清理前,再做修正

4. 並發清除(和用戶線程一起)

基於標記結果,直接清理對象

這裡就能很明顯的看出,為什麼CMS要使用標記清除而不是標記壓縮,如果使用標記壓縮,需要多對象的內存位置進行改變,這樣程序就很難繼續執行。但是標記清除會產生大量內存碎片,不利於內存分配。

CMS收集器的日誌輸出:

儘可能降低停頓CMS收集器特點:

會影響系統整體吞吐量和性能

比如,在用戶線程運行過程中,分一半CPU去做GC,系統性能在GC階段,反應速度就下降一半

清理不徹底

因為在清理階段,用戶線程還在運行,會產生新的垃圾,無法清理

因為和用戶線程一起運行,不能在空間快滿時再清理(因為也許在並發GC的期間,用戶線程又申請了大量內存,導致內存不夠)

-XX:CMSInitiatingOccupancyFraction設置觸發GC的閾值

如果不幸內存預留空間不夠,就會引起concurrent mode failure

CMS也提供了整理碎片的參數:一旦 concurrent mode failure產生,將使用串列收集器作為後備。

-XX:+ UseCMSCompactAtFullCollection Full GC後,進行一次整理

整理過程是獨佔的,會引起停頓時間變長

-XX:+CMSFullGCsBeforeCompaction

設置進行幾次Full GC後,進行一次碎片整理

-XX:ParallelCMSThreads

設定CMS的線程數量(一般情況約等於可用CPU數量)

CMS的提出是想改善GC的停頓時間,在GC過程中的確做到了減少GC時間,但是同樣導致產生大量內存碎片,又需要消耗大量時間去整理碎片,從本質上並沒有改善時間。

4. G1收集器

G1是目前技術發展的最前沿成果之一,HotSpot開發團隊賦予它的使命是未來可以替換掉JDK1.5中發布的CMS收集器。

與CMS收集器相比G1收集器有以下特點:

1. 空間整合,G1收集器採用標記整理演算法,不會產生內存空間碎片。分配大對象時不會因為無法找到連續空間而提前觸發下一次GC。

2. 可預測停頓,這是G1的另一大優勢,降低停頓時間是G1和CMS的共同關注點,但G1除了追求低停頓外,還能建立可預測的停頓時間模型,能讓使用者明確指定在一個長度為N毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒,這幾乎已經是實時Java(RTSJ)的垃圾收集器的特徵了。

上面提到的垃圾收集器,收集的範圍都是整個新生代或者老年代,而G1不再是這樣。使用G1收集器時,Java堆的內存布局與其他收集器有很大差別,它將整個Java堆劃分為多個大小相等的獨立區域(Region),雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔閡了,它們都是一部分(可以不連續)Region的集合。

G1的新生代收集跟ParNew類似,當新生代佔用達到一定比例的時候,開始出發收集。

和CMS類似,G1收集器收集老年代對象會有短暫停頓。

步驟:

標記階段,首先初始標記(Initial-Mark),這個階段是停頓的(Stop the World Event),並且會觸發一次普通Mintor GC。對應GC log:GC pause (young) (inital-mark)

Root Region Scanning,程序運行過程中會回收survivor區(存活到老年代),這一過程必須在young GC之前完成。

Concurrent Marking,在整個堆中進行並發標記(和應用程序並發執行),此過程可能被young GC中斷。在並發標記階段,若發現區域對象中的所有對象都是垃圾,那個這個區域會被立即回收(圖中打X)。同時,並發標記過程中,會計算每個區域的對象活性(區域中存活對象的比例)。

Remark, 再標記,會有短暫停頓(STW)。再標記階段是用來收集 並發標記階段 產生新的垃圾(並發階段和應用程序一同運行);G1中採用了比CMS更快的初始快照演算法:snapshot-at-the-beginning (SATB)。

Copy/Clean up,多線程清除失活對象,會有STW。G1將回收區域的存活對象拷貝到新區域,清除Remember Sets,並發清空回收區域並把它返回到空閑區域鏈表中。

複製/清除過程後。回收區域的活性對象已經被集中回收到深藍色和深綠色區域。

5. 安全點

GC的停頓主要來源於可達性分析上,程序執行時並非在所有地方都能停頓下來開始GC,只有在到達安全點時才能暫停。

安全點的選定基本上是以程序「是否具有讓程序長時間執行的特徵」為標準進行選定的——因為每條指令執行的時間都非常短暫,程序不太可能因為指令流長度太長這個原因而過長時間運行,「長時間執行」的最明顯特徵就是指令序列復用,例如方法調用、循環跳轉、異常跳轉等,所以具有這些功能的指令才會產生安全點。

接下來的問題就在於,如何讓程序在需要GC時都跑到安全點上停頓下來,大多數JVM的實現都是採用主動式中斷的思想。

主動式中斷的思想是當GC需要中斷線程的時候,不直接對線程操作,僅僅簡單地設置一個標誌,各個線程執行時主動去輪詢這個標誌,發現中斷標誌為真時就自己中斷掛起,輪詢標誌的地方和安全點是重合的,另外再加上創建對象需要分配內存的地方。

其他:

只要記住流行的組合就這幾種情況

Serial

ParNew + CMS

ParallelYoung + ParallelOld

G1GC

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序源 的精彩文章:

程序員創業三年,然後
PHP哈希表碰撞攻擊原理

TAG:程序源 |

您可能感興趣

谷歌AI演算法通過OCR與NGrams提取和分析電視台內容傾向
基於Crypto++密碼庫的ECIES和ECDSA演算法的聯合使用
攻擊AI模型之FGSM演算法
攻擊 AI 模型之 FGSM 演算法
談談常見的幾種CFD演算法-FVM FDM FEM MPS SPH LBM究竟有什麼區別
比TD、MC、MCTS指數級快,性能超越A3C、DDQN等模型,這篇RL演算法論文在Reddit上火了
商湯聯合提出基於FPGA的快速Winograd演算法:實現FPGA之上最優的CNN表現與能耗
終於把微軟BING搜索-SPTAG演算法的原理搞清了
基於AI演算法 Adobe推出VR數據體驗應用
NLP1:BLEU演算法和N-Gram
Nature:利用機器學習演算法預測細胞如何修復CRISPR誘發的DNA斷裂
MATLAB常用演算法與應用實例分享來襲!
RVN白皮書:X16R演算法-抗ASIC設計
快手CEO稱將用正確價值觀指導演算法;工信部調查WiFi萬能鑰匙等蹭網類APP;V2EX站長被指非法公開用戶隱私信息
DeepMind高級研究員:重新理解GAN,最新演算法、技巧及應用(PPT)
IBM的Watson AI用於開發多面跟蹤演算法
超Mask RCNN速度4倍,僅在單個GPU訓練的實時實例分割演算法
OpenCV3中ORB特徵提取演算法的實現與分析
基於MUSIC的演算法利用腕上光電容積 脈搏波(PPG)信號提供按需心率估算
Grid R-CNN解讀:商湯最新目標檢測演算法,定位精度超越Faster R-CNN