Docker 的優(yōu)點
717
2025-04-08
#JVM進(jìn)階(七)——從GC日志分析堆內(nèi)存
在前面的文章中,我們只設(shè)置了整個堆的內(nèi)存大小。但是我們知道,堆又分為了新生代,年老代。他們之間的內(nèi)存怎么分配呢?新生代又分為Eden和Survivor,他們的比例大小能改變嗎?其實這些都是可控的,以前沒有講到是因為就算講了也只是講講而已,看不到實質(zhì)性的東西。因此這章我們通過分析GC日志來一步步講解如何細(xì)化設(shè)置堆內(nèi)存。
首先我們來了解幾個相關(guān)的參數(shù):
-XX:+PrintGCDetails:用于告訴虛擬機(jī)回收垃圾的時候順便打印日志
-Xloggc:路徑 :將打印出來的日志信息保存至指定的路徑
-Xmn10M:設(shè)置新生代的內(nèi)存大小
-XX:SurvivorRatio=8:1調(diào)整Eden和Survivor的比例為8:1
我們還是用前面的代碼例子來講:
然后用參數(shù)-Xms20m -Xmx20m -Xmn10
-XX:+PrintGCDetails -Xloggc:d:\gc1.log啟動。表示給堆分配20M,給新生代分配10M,打印GC日志,并將其輸出至D盤的gc1.log文件中。運行后得到以下日志,這是第一部分:
現(xiàn)在我們來分析下每個部分代表的含義:
1)0.090:就是虛擬機(jī)從啟動到現(xiàn)在經(jīng)歷的時間。
2)GC:指的是停頓類型(留著下一章講)
3)PSYoungGen:發(fā)生GC的區(qū)域,這里指的是年輕代。根據(jù)收集器的種類而定。
4)7284K->1016K(9216K):該區(qū)域GC前當(dāng)前區(qū)域所使用的容量–>該區(qū)域GC后已使用的容量(該區(qū)域的總?cè)萘浚簿褪切律娜萘俊?/p>
5)7284K->6139K(19456K):整個堆GC前當(dāng)前區(qū)域所使用的容量–>整個堆GC后已使用的容量(整個堆的總?cè)萘浚?/p>
6) 0.0078481:這次GC所占用的時間。
我們再來看看第二部分:
看圖畫紅線部分,表示當(dāng)前的堆中新生代可用內(nèi)存的大小(一個eden和一個Survivor視為可用內(nèi)存),紅色框下面則是年老區(qū)的大小,加上一共是20m,符合我們所設(shè)置的。
紅色框的部分則是新生代中eden區(qū)和兩個Survivor區(qū)的大小,可以看出他們的比例是8:1,如果設(shè)置為-XX:SurvivorRatio=3的話,結(jié)果如下
到這里以上幾個參數(shù)的作用以及分析就講完啦,小伙伴們可以打開自己的工具試一試,感受一下。以后碰到了內(nèi)存泄漏或者內(nèi)存不足的話就可以直接查看日志來進(jìn)行分析調(diào)優(yōu)了!
 
JVM 日志分析服務(wù) LOG
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。