线上CPU很高、内存占用很少,有能快速查找到原因的方法吗?
发布时间:2018-03-21编辑:caoww阅读(907)
给一个代码,在Linux下保存成.sh文件直接执行即可。
#!/bin/sh
ts=$(date +"%s")jvmPid=$1defaultLines=100defaultTop=20threadStackLines=${2:-$defaultLines}topThreads=${3:-$defaultTop}jvmCapture=$(top -b -n1 | grep java )threadsTopCapture=$(top -b -n1 -H | grep java )jstackOutput=$(echo "$(jstack $jvmPid )" )topOutput=$(echo "$(echo "$threadsTopCapture" | head -n $topThreads | perl -pe 's/\e\[?.*?[\@-~] ?//g' | awk '{gsub(/^ +/,"");print}' | awk '{gsub(/ +|[+-]/," ");print}' | cut -d " " -f 1,9 )\n ")echo "*************************************************************************************************************"uptime
echo "Analyzing top $topThreads threads"echo "*************************************************************************************************************"printf %s "$topOutput" | while IFS= read linedo
pid=$(echo $line | cut -d " " -f 1)
hexapid=$(printf "%x" $pid)
cpu=$(echo $line | cut -d " " -f 2)
echo -n $cpu"% [$pid] "
echo "$jstackOutput" | grep "tid.*0x$hexapid " -A $threadStackLines | sed -n -e '/0x'$hexapid'/,/tid/ p' | head -n -1
echo "\n"done
echo "\n"
代码的意思,打印出JVM的所有线程以及按照CPU占比排序。