故障:最近收到生產服務器的報警短信以及郵件,報警內容爲:內存使用率高於70%。java
使用top命令查看系統資源的使用狀況,命令:topvim
如圖能夠看到java的進程內存使用率較高,java進程的內存使用率達到了70%+服務器
2.定位線程問題(經過命令查看9718進程的線程狀況),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,time,tname,cmd多線程
由此能夠看到這PID:9718的進程產生了不少線程。接下來就能夠經過jstack查看內存使用的堆棧。ide
3. 查看內存使用的堆棧:在這裏咱們挑選了TID=9720的線程進行分析,首先須要將9731這個id轉換爲16進制。需輸入以下命令,優化
printf "%x\n" 9731spa
接下須要使用16進制的2603線程
4. 將PID爲9718的堆棧信息打印到jstack.log中,命令:jstack -l 9718 > jstack.logorm
5. 查看堆棧信息文件,命令:vim jstack.logblog
在進行搜索TID爲2603的相關信息。如圖:
能夠看到這個線程狀態爲:WAITING。經過查看文件分析 看到大量 Java Thread State。
說明它在等待另外一個條件的發生,來把本身喚醒,或者乾脆它是調用了 sleep(N)。
此時線程狀態大體爲如下幾種:
java.lang.Thread.State: WAITING (parking):一直等那個條件發生;
java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定時的,那個條件不到來,也將定時喚醒本身。
6.代碼優化:將文件發送給開發。優化下線程
本文轉載於https://blog.51cto.com/chengxiaobai/2052530?cid=695076