JVM內存問題定位


一、查看機器資源使用狀態:

使用top命令,內存占用較高的那個PID對應的進程一般就是JVM了

二、查看Swap狀態:

使用free -m 命令,一般內存占用過高會導致swap占用也偏高,看看swap占用比例,如何超過50%,就比較危險了

三、確認swap占用:

cat /proc/$PID/smaps | grep 'Swap' | sort

四、找出該進程內最耗費CPU的線程,可以使用

1)ps -Lfp pid 2)ps -mp pid -o THREAD, tid, time 3)top -Hp pid 用第三個,輸出如下:


TIME列就是各個Java線程耗費的CPU時間,CPU時間最長的是線程ID為XX的線程,用

printf "%x\n" $XX

得到XX的十六進制值為xx,下面會用到。

OK,下一步終於輪到jstack上場了,它用來輸出進程XX的堆棧信息,然后根據線程ID的十六進制值grep,如下:

root@ubuntu:/# jstack $XX | grep $xx
 

如果報錯:
sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp,請參考:http://zhangshaoxiong.blog.51cto.com/4408282/1310166


附,查看swap占用的腳本:
#!/bin/bash
# 獲取swap使用情況
function getSwap() {
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"`
do
PID=`echo ${DIR} | cut -d / -f 3`
PROGNAME=`ps -p ${PID} -o comm --no-headers`
for SWAP in `grep Swap ${DIR}/smaps 2>/dev/null| awk '{ print $2 }'`
do
let SUM=$SUM+$SWAP
done
if [[ ${SUM} -gt 0 ]]; then
echo "$PID $SUM $PROGNAME"
fi

let OVERALL=$OVERALL+$SUM
SUM=0
done
echo "swap總使用量: $OVERALL "
}

function sorted(){
echo "PID Swap_used Program"
getSwap
echo "$?"| sort -n -t ' ' -k 2r -k 1 | awk '{ print $1 $2 $3}'
}

sorted
 
        

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM