JVM内存问题定位

Posted 一人浅醉-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

  

 

以上是关于JVM内存问题定位的主要内容,如果未能解决你的问题,请参考以下文章

JVM内存问题定位

详解Jvm内存结构

详解Jvm内存结构

详解Jvm内存结构

jvm——JVM自带内存分析工具详解

Day335.对象的实例化内存布局与访问定位直接内存 -JVM