JAVA中GC日志的相關(guān)知識(shí)有哪些

這篇文章主要為大家展示了“JAVA中GC日志的相關(guān)知識(shí)有哪些”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“JAVA中GC日志的相關(guān)知識(shí)有哪些”這篇文章吧。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),商州企業(yè)網(wǎng)站建設(shè),商州品牌網(wǎng)站建設(shè),網(wǎng)站定制,商州網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,商州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

GC環(huán)境模擬

首先我們給出如下代碼用來(lái)觸發(fā)GC

public static void main(String[] args) {
// 每100毫秒創(chuàng)建100線程,每個(gè)線程創(chuàng)建一個(gè)1M的對(duì)象,即每100ms申請(qǐng)100M堆空間
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {
for (int i = 0; i < 100; i++) {
new Thread(() -> {
try {
// 申請(qǐng)1M
byte[] temp = new byte[1024 * 1024];
Thread.sleep(new Random().nextInt(1000)); // 隨機(jī)睡眠1秒以?xún)?nèi)
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}, 1000, 100, TimeUnit.MILLISECONDS);
}

我們要模擬的場(chǎng)景是年輕代不斷地Young GC,并有一部分對(duì)象晉升到老年代,當(dāng)老年代空間不足時(shí)觸發(fā)Full GC。

程序邏輯:每100毫秒鐘創(chuàng)建100個(gè)線程,每個(gè)線程創(chuàng)建一個(gè)1M的對(duì)象,即每100ms申請(qǐng)100M堆空間。之所以每個(gè)線程隨機(jī)睡眠1s,是為了避免對(duì)象朝生夕滅,保證可以有一部分對(duì)象能晉升到老年代,更好的觸發(fā)Young GC 和 Full GC,注意這個(gè)睡眠時(shí)間如果大了,會(huì)導(dǎo)致OOM,如果小了,很難觸發(fā)FULL GC。

虛擬機(jī)參數(shù)解釋

啟動(dòng)Java進(jìn)程:java -Xms200m -Xmx200m -Xmn100m -verbose:gc -XX:+PrintGCDetails -Xloggc:./gc.log -XX:+PrintGCDateStamps -jar demo-0.0.1-SNAPSHOT.jar

-Xms200m -Xmx200m 最小/最大堆內(nèi)存 200M

-Xmn100m 年輕代內(nèi)存 100M

-verbose:gc 開(kāi)啟GC日志

-XX:+PrintGCDetails -Xloggc:./gc.log -XX:+PrintGCDateStamps 將GC日志詳情輸入到gc.log中

jmap分析

jcmd 獲取我們Java進(jìn)程的Id:6264

jmap -heap 6264查看堆信息

第一次查看,我們發(fā)現(xiàn) Eden區(qū)是98M,S0、S1是1M

JAVA中GC日志的相關(guān)知識(shí)有哪些

第二次查看, Eden區(qū)是99M,S0、S1是0.5M

JAVA中GC日志的相關(guān)知識(shí)有哪些

Eden區(qū)與Survivor區(qū)的比例在動(dòng)態(tài)的變化,并不是默認(rèn)的8:1:1。

原來(lái)我們使用默認(rèn)的垃圾收集器Parallel Scavenge+Parallel Old組合,而該收集器下-XX:+UseAdaptiveSizePolicy是默認(rèn)開(kāi)啟的,即Eden區(qū)與Survivor區(qū)比例根據(jù)GC情況會(huì)自適應(yīng)變化。

我們加上參數(shù),關(guān)閉年輕代自適應(yīng),年輕代比例設(shè)置為8:1:1

-XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=8

另外為了盡早的觸發(fā)FULL GC,我們新增虛擬機(jī)參數(shù)

-XX:MaxTenuringThreshold=10

晉升年齡由默認(rèn)的15修改為10,使得年輕代的對(duì)象更容易晉升到老年代

重啟虛擬機(jī)查看jmap

JAVA中GC日志的相關(guān)知識(shí)有哪些

年輕代

  • Eden區(qū)80M 已使用51M,當(dāng)前使用率63.8%

  • S0區(qū)10M 已使用0.43M,使用率4.37%

  • S1區(qū)10M 使用率為空

老年代

  • 100M 已使用18.39M,使用率18.9%

GC日志內(nèi)容分析

查看我們輸出的GC日志gc.log,選取其中兩段

2019-06-09T02:55:30.993+0800: 330.811: [GC (Allocation Failure) [PSYoungGen: 82004K->384K(92160K)] 184303K->102715K(194560K), 0.0035647 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2019-06-09T02:55:30.997+0800: 330.815: [Full GC (Ergonomics) [PSYoungGen: 384K->0K(92160K)] [ParOldGen: 102331K->5368K(102400K)] 102715K->5368K(194560K), [Metaspace: 16941K->16914K(1064960K)], 0.0213953 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

Young GC

2019-06-09T02:55:30.993+0800: 330.811: [GC (Allocation Failure) [PSYoungGen: 82004K->384K(92160K)] 184303K->102715K(194560K), 0.0035647 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2019-06-09T02:55:30.997+0800: 330.815: [Full GC (Ergonomics) [PSYoungGen: 384K->0K(92160K)] [ParOldGen: 102331K->5368K(102400K)] 102715K->5368K(194560K), [Metaspace: 16941K->16914K(1064960K)], 0.0213953 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

解釋:

  • 年輕代GC:[GC前年輕代80.08M->GC后0.37M(年輕代總大小90M)]GC前堆179.98M->GC后堆100.3M(堆總大小190M),用時(shí)]

  • 其中年輕代總大小是90M而不是100M,這里我理解是年輕代當(dāng)前最大申請(qǐng)到90M

  • 100M*80%=80M 是Eden區(qū)大小

  • 80M*80% = 64M Eden區(qū)默認(rèn)占用超過(guò)8成即64M就會(huì)觸發(fā)YoungGC

Full GC

[Full GC (Ergonomics) [PSYoungGen: 384K->0K(92160K)] [ParOldGen: 102331K->5368K(102400K)] 102715K->5368K(194560K), [Metaspace: 16941K->16914K(1064960K)], 0.0213953 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

解釋?zhuān)?/p>

  • [GC前年輕代0.375M->GC后年輕代0M(年輕代總大小90M)][GC前老年代99.93M->GC后老年代5.24M(老年代總大小100M)]GC前堆100.3M->GC后堆5.24M(堆總大小190M),[元數(shù)據(jù)區(qū):GC前16.5,GC后16.5(元數(shù)據(jù)區(qū)總大小1040M)],用時(shí)]

  • 可以推測(cè)出此次FullGC原因是年輕代晉升老年代空間不足導(dǎo)致

利用可視化工具分析

這里我們利用 gceasy.io/ 分析一下

(1)統(tǒng)計(jì)年輕代、老年代、元數(shù)據(jù)區(qū)最大可用空間以及峰值,這里元數(shù)據(jù)區(qū)大小在我們的虛擬機(jī)參數(shù)沒(méi)有配置,所以取的是默認(rèn)值

JAVA中GC日志的相關(guān)知識(shí)有哪些

(2)吞吐量、GC平均延遲、最大延遲以及延遲區(qū)間的統(tǒng)計(jì)

JAVA中GC日志的相關(guān)知識(shí)有哪些

(3)堆所用大小的實(shí)時(shí)分析,紅色位置是發(fā)生了FullGC使得堆總量直線下降

JAVA中GC日志的相關(guān)知識(shí)有哪些

會(huì)發(fā)現(xiàn)虛擬機(jī)在剛啟動(dòng)不久的階段觸發(fā)大量的FULL GC,我的理解是我們申請(qǐng)的對(duì)象都隨機(jī)睡眠一秒以?xún)?nèi),剛啟動(dòng)時(shí)大部分還存在線程的引用,GCRoot可達(dá)。在剛啟動(dòng)的時(shí)候觸發(fā)FULL GC并不會(huì)完整清理掉老年代空間并由于空間不足不斷觸發(fā)FULL GC。

(4)GC空間總量和時(shí)間的統(tǒng)計(jì)

JAVA中GC日志的相關(guān)知識(shí)有哪些

(5)各類(lèi)GC時(shí)間、GC次數(shù)、GC總量等指標(biāo)

JAVA中GC日志的相關(guān)知識(shí)有哪些

以上是“JAVA中GC日志的相關(guān)知識(shí)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站名稱(chēng):JAVA中GC日志的相關(guān)知識(shí)有哪些
分享路徑:http://muchs.cn/article46/pgddhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、域名注冊(cè)網(wǎng)站內(nèi)鏈、定制網(wǎng)站建站公司、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化