最近做了一些troubleshooting 的工作,现在分享一点与 Java 应用排障有关的小知识给大家(不要钱),如果掌握了这几个工具可以帮忙你理性分析问题(分析问题有个好的思路是 "将正常和异常时的情况进行对比分析",一定可以找到些蛛丝马迹):
- 1.查看当前系统有哪些 java 进程的,不加参数会列出所有的进程 id(但这个列表可能会不准确,如果查不到,还是要以 ps -ef 为准) jps
- 2.查看 jvm 的 gc 情况,可以看到gc 次数,gc 停顿的时间等 jstat -gc pid
- 3.查看 当前 jvm 进程的内存分配和使用情况,尤其可以看到老年代的分配大小及使用率。 jmap -heap pid
- 4.查看当前jvm 中所有对象的大小和数量,用来分析 jvm 内存占用。 jmap -histo pid
- 5. 查看当前 jvm 中的所有线程,用来分析线程堆栈。 jstack pid 如果查当前的总线程数, 可以用 jstack pid > thread.log 输出到 thread.log 文件中,然后用 grep 'prio='来进行过滤统计;也可以查看某组线程的数据量、线程 Runnable 等情况。
附上一个方便的脚本工具:
javatool.sh
javaProcess=$(ps -ef|grep java|grep -v grep|awk '{ print $2 }')
#echo "${javaProcess}"
for javaproc in ${javaProcess[@]}
do
echo " 进程号: ${javaproc}"
echo "----------2-jvm 的 gc 情况:-----------"
jstat -gc ${javaproc}
sleep 2
echo "-----3-查看 当前 jvm 进程的内存分配和使用情况,尤其可以看到老年代的分配大小及使用率--------------"
jmap -heap ${javaproc}
sleep 2
echo "4-查看当前jvm 中所有对象的大小和数量,用来分析 jvm 内存占用"
jmap -histo ${javaproc}
sleep 2
echo "5-查看当前 jvm 中的所有线程,用来分析线程堆栈"
jstack ${javaproc} >./${javaproc}.log
grep "prio=" ./${javaproc}.log
sleep 2
done