日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jvm垃圾内存回收问题

發布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jvm垃圾内存回收问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CrashReport系統在游戲內測當天出現了異常情況JVM僵死,通過top -p <PID> -H 結合jstack(jstack -m -l pid)查看,發現是VM Thread線程CPU占用100%,線程ID好為18540,線程信息如下:
----------------- 18540 -----------------
0xb7904280 ? ? ?_ZN9MarkSweep12follow_stackEv + 0x30
0xb79b0637 ? ? ?_ZN11PSMarkSweep17mark_sweep_phase1Eb + 0xe7
0xb79af737 ? ? ?_ZN11PSMarkSweep16invoke_no_policyEb + 0x3c7
0xb79ba0ae ? ? ?_ZN10PSScavenge6invokeEv + 0x12e
0xb797f999 ? ? ?_ZN20ParallelScavengeHeap19failed_mem_allocateEjb + 0x49
0xb7ab191a ? ? ?_ZN29VM_ParallelGCFailedAllocation4doitEv + 0x5a
0xb7ac0096 ? ? ?_ZN12VM_Operation8evaluateEv + 0x46
0xb7abf523 ? ? ?_ZN8VMThread18evaluate_operationEP12VM_Operation + 0x83
0xb7abf794 ? ? ?_ZN8VMThread4loopEv + 0x194
0xb7abf280 ? ? ?_ZN8VMThread3runEv + 0x80
0xb796d64e ? ? ?_Z10java_startP6Thread + 0x14e
0x0056849b ? ? ?start_thread + 0xcb

Parallel GC 是JVM的垃圾回收線程( ParallelGC垃圾回收方式的特點是在New區開啟多線程回收)
既然是垃圾回收線程CPU占用100%,那么說明我們的應用的JVM內存使用有問題,借助jstat查看JVM的內存信息如下:
jstat -gcutil pid 5000 #這里是說每隔5000毫秒打印異常JVM內存信息

存活區0存活區1伊甸區Old區永久區新生帶GC次數新生帶GC時間Full GC次數Full GC時間GC的總時間
?S0S1EOPYGCYGCTFGCFGCTGCT
?0.00010010098.7558413.2814473699.6593712.939
?0.00010010098.7558413.2814473699.6593712.939
?0.00010010098.7558413.2814473699.6593712.939
?0.00010010098.7558413.2814483702.1353715.416
?0.00010010098.7558413.2814483702.1353715.416

存活區0和存活區1的內存占用都是0%,伊甸區使用100%,Old區使用也是100%,Full GC的次數達到1448(3個小時內,差不多9s做一次Full GC,每次Full GC花費2.56s)
也就是說我們的應用頻繁的在做Full GC,而且Full GC消耗的時間也比較長,應用在做Full GC是整個應用是會阻塞的,所以在這種情況下我們的應用幾乎是不可用的。
什么情況下會引發Full GC呢?參考下圖:



Old區內存不夠是JVM會觸發Full GC,由于Old區一直是滿的,所以會頻繁觸發Full GC,但是這個頻度也不高,應該不至于導致CPU使用100%,我們用的是Parallel GC(并行GC),并行GC是說在新生帶會采取多線程來進行垃圾回收,由于我們Eden區也是滿的,所以GC的線程會CPU占用100%。
怎么查看我們的JVM每個區的內存大小情況呢?用jstat -gccapacity <PID>可以得到結果如下:
新生帶最小新生帶最大新生帶當前存活區存活區伊甸區老年帶最小老年帶最大老年帶當前Old區內存占用永久區最小永久區最大永久區當前永久區內存占用新生帶GC次數Full GC 次數
NGCMNNGCMXNGCS0CS1CECOGCMNOGCMXOGCOCPGCMNPGCMXPGCPCYGCFGC
2182434950464384211239045644843712699072178496178496163846553635712357121469
21.3125341.312562.8752.06253.812555.12542.6875682.6875174.3125174.3125166434.87534.875


我們的Eden區較小,這個可能會觸發JVM的一個BUG(1.6u18前的版本,我們的版本是:java version "1.6.0_37")正好在這個范圍內,具體信息查看:http://www.oschina.net/question/1092_24066
嘗試升級jdk版本或者調整JVM內存參數解決該問題。


轉載于:https://blog.51cto.com/zhangshaoxiong/1206281

總結

以上是生活随笔為你收集整理的jvm垃圾内存回收问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。