線上解決問題分享:JAVA進程不斷吃內存,一段時間內CPU佔用100%
1. 問題描述
線上運行的JAVA進程不斷吃內存,一段時間內CPU佔用100% ,服務響應緩慢。
2. 分析過程
通過top命令,發現該tomcat進程佔用CPU100%,通過free -m查看內存使用情況,可用內存加上buffer只剩下四分之一了。首先來分析一下內存使用情況,用jmap工具來查看堆棧(命令:jmap -heap 27688 見頁未詳細信息),沒有發現異常情況。 PS Perm Generation 99.62005615234375% used 這個並不是異常,設置了1G的PS Perm。
然後用jmap工具來查看所有對象佔用的內存情況(jmap -histo:live 27688 見頁未詳細信息),發現字元串佔用了5G的內存([C 表示的就是char,string類型的數據),問題肯定出在這裡了,至於怎樣定位到哪些代碼申請了這麼多的內存,需要定位到具體的線程,然後可以列印線程堆棧來定位到具體的代碼,根據此想法,我們來分析一下各個線程佔用CPU情況。
使用top -Hp 27688能實時查看哪些線程佔用CPU較高,這個命令是把線程佔用CPU的高低排序顯示的。結果我們發現有10多個線程持續佔用CPU較高,把這10多個線程ID取出來,然後用jstack工具列印線程的堆棧信息。注意:jstack工具列印線程ID是16進位的,我們需要把10多個線程ID轉換為16進位的(printf "%x
" 30562,結果是:7762)。列印線程堆棧:jstack 27688 grep 7762 -A60 (見頁未詳細信息),這個命令就會把該線程目前的堆棧信息列印出來。發現對應的代碼有問題:
3. 解決辦法
4. 結論
我們使用了一個有問題的開源包,會不停的申請string 對象,導致內存佔滿,同時這裡也會佔用較高的CPU,這時候GC線程發現沒有內存了,需要不停的做GC,做GC需要佔用較高的CPU,所以我們看到了內存不夠了,CPU佔滿額想像。
5. 命令詳情
jmap -heap 27688
jmap -histo:live 27688
top -Hp 27688
jstack 27688 grep 7762 -A60
http-nio-80-exec-3" daemon prio=10 tid=0x00007f889c1c7000 nid=0x7762 runnable [0x00007f887b1eb000]
本文完。
覺得本文有收穫?請轉發分享給更多人
關注「 物聯網技術交流平台 」,了解更多知識
TAG:物聯網技術交流平台 |
※更加時尚運動 HUAWEI WATCH 2 2018版體驗分享
※分享一些 VAIO S11 2018 款購買建議
※「BigBang」「分享」180511 一晃又三年《LOSER》獲得一位GD眼眶濕潤
※速寫乾貨分享ARTS·352期
※「GFRIEND」「分享」180525 首次單獨演唱會DVD決定發行 不要錯過快來收藏吧!
※蘋果分享 macOS 10.13.4 針對 eGPU 的支持文檔
※「GFRIEND」「分享」180501 GFRIEND《周偶》預告再公開!周三下午鎖定地下三層
※H5教程,給大家分享一個HTML5Plus移動應用
※在Iot協議中,只知道WiFi藍牙未免太OUT,一文分享其它10種,值得收藏了解
※JANUS電影分享:《Maudie,2016》
※Yaman HRF 10T 使用感受分享
※彈出年輕 膠你變美 2018 FANCL TENSE UP美容分享會
※2018孕遇母親節特輯 | VBAC剖後順:媽媽分享
※CVPR 2018 中國論文分享會之「GAN 與合成」
※區塊鏈+數據安全項目分享-數據盾陀螺財經VALUE100線下活動第二期
※3月20日,JUNNE去了一個分享會 | 2018A/W 上海時裝周新聞發布會
※小米MIX2使用一周後的美圖分享
※JUSERE·分享|80%新娘都不知道的婚紗內衣搭配攻略,趕緊收藏~
※SAT一線考生3500字備考心得分享!
※2.2預產期,2.1順產男寶一枚,分享孕期癥狀