通过写脚本的方式自动获取JVM内的进程堆栈信息等内容

公司转java之后 经常会遇到java进程占用CPU特别多的情况. 每次连上机器进行处理都比较慢了. 索性自己写一个脚本, 把想要查询的信息直接汇总进去. 这样的话 就简单很多了. 

脚本也很简单主要如下:

简单解释一下

1. 将产品的 java 路径定义到环境变量里面去. 便于使用命令. 注意这一个可以根据不同的安装目录进行修正. 

2. 获取当前正在运行的进程号. 当然还可以使用其他的命令获取.

3. 获取当前日期加时分的一个变量. 

4. 并且进行简单的echo输出, 便于后续的查看

5. top 一下这个进程. 并且将进程排序前五名的进程id 和cpu 占用率打印出来. 使用了 awk 和 sed 等多个命令. 

6. 使用 jcmd 的命令打印相关信息 主要有 VM.flags , Thread.print , GC.class_histogram , GC.heap_info 等. 

7. 再次打印一下占用量较高的进程信息.

8. 根据 state的关键词进行过滤,并且将同一行的信息进行查看展示和打印.  并且使用 sort和uniq 组合命令进行简单计算. 展示当前进程的状态分组情况. 

export PATH=$PATH:/gscloud/jstack/runtime/java/x86_64-linux/bin/
export pid=`jps |grep caf-bootstrap.jar |awk '{print $1 }' `
echo $pid
export now=`date +%Y%m%d%H%M`
echo $now.log
#cd /javalog
top -Hp $pid -n 1 |awk '{print "占CPU较高的进程号 " $1 " 该进程CPU占用率 " $9}' |sed -n '8,12p' >> $now.log
echo "JVM虚拟机的参数信息" >> $now.log
jcmd $pid VM.flags >> $now.log
echo "JVM虚拟机的进程信息" >> $now.log
jcmd $pid Thread.print >> $now.log
echo "JVM虚拟机的类信息" >> $now.log
jcmd $pid GC.class_histogram >> $now.log
echo "JVM虚拟机的GC堆的信息" >> $now.log
jcmd $pid GC.heap_info >> $now.log
top -Hp $pid -n 2  >> $now.log
echo " "  >> $now.log
top -Hp $pid -n 1 |awk '{print "占CPU较高的进程号 " $1 " 该进程CPU占用率 " $9}' |sed -n '8,12p' >> $now.log
echo "简单统计不同进程的state信息 "  >> $now.log

cat  $now.log  |grep  "java.lang.Thread.State:" |awk '{print $2$3$4$5}' |sort |uniq -c >> $now.log
#tar -zcvf $now.log.tar.gz $now.log --remove-files

可以简单看一个打印结果信息. 

大概十秒左右收集完信息

 查看文件. 

(现在没有什么负载, 所以基本上看不到有高占用的情况.)

 文档的末尾有简单的排序信息:

可以看到这十秒钟之类的进程占用信息有了变化.

原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/13305210.html