您的位置:首页 > 其它

JVM内存问题定位

2017-06-26 11:49 232 查看
一、查看机器资源使用状态:

使用top命令,内存占用较高的那个PID对应的进程一般就是JVM了

二、查看Swap状态:

使用free-m命令,一般内存占用过高会导致swap占用也偏高,看看swap占用比例,如何超过50%,就比较危险了

三、确认swap占用:

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

四、找出该进程内最耗费CPU的线程,可以使用

1)ps-Lfppid
2)ps-mppid-oTHREAD,tid,time
3)top-Hppid
用第三个,输出如下:


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_regsfailedforalwp,请参考:http://zhangshaoxiong.blog.51cto.com/4408282/1310166

附,查看swap占用的脚本:


#!/bin/bash
#获取swap使用情况
functiongetSwap(){
SUM=0
OVERALL=0
forDIRin`find/proc/-maxdepth1-typed|egrep"^/proc/[0-9]"`
do
PID=`echo${DIR}|cut-d/-f3`
PROGNAME=`ps-p${PID}-ocomm--no-headers`
forSWAPin`grepSwap${DIR}/smaps2>/dev/null|awk'{print$2}'`
do
letSUM=$SUM+$SWAP
done
if[[${SUM}-gt0]];then
echo"$PID$SUM$PROGNAME"
fi

letOVERALL=$OVERALL+$SUM
SUM=0
done
echo"swap总使用量:$OVERALL"
}

functionsorted(){
echo"PIDSwap_usedProgram"
getSwap
echo"$?"|sort-n-t''-k2r-k1|awk'{print$1$2$3}'
}

sorted



  


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: