1 什么是javacore
javacore是JVM内所有线程信息的日志输出,通常又叫做thread dump,可以了解当前系统在做什么,对于问题分析还是会很有帮助;这个信息中包含线程的调用栈及线程的运行状态。执行thread dump获取javacore日志不会停止应用。
2 如何获取javacore
在新版本的JDK提供了jstack工具后,建议都使用该工具来获取javacore.使用jstack获取javacore的步骤如下:
使用jps得到java相关进程的pid,执行jps -v
得pid后,执行jstack -l > javacore..log. 如:jstack -l 1772 > javacore.1772.log
Tips: 为了有一个比较,通常,会在间隔一定的时间后(如5s、10s,30s)多次取javacore。注意,此时应该使用 >> 以追加的方式重定向输出
-
另外,在Linux系统下,通过kill -3 也是获取javacore的方法。不过,该方法的日志输出不是很好确定。所以,如果可以的话,尽量使用jstack工具获取。
2.1 产生多个JavaCore的工具
输出多个Java Core的脚本
pids=`pgrep -f /home/MLF/TRS/jdk1.7.0_71/`
echo $pids
for (( c=1;c<=50;c++ ))
do
echo "操作系统密码" |sudo -S /home/MLF/TRS/jdk1.7.0_71/bin/jstack -l $pids > /home/MLF/TRS/TRSWCMV7/wcmlogs/javacore_$(date -d "yesterday" +"%Y%m%d%H%M%S")_$c.txt
# echo $c
#echo javacore_$(date -d "yesterday" +"%Y%m%d%H%M%S")_$c.txt
sleep 1
done
出现CPU占用很高或者发布时间执行很长时,一般都要用到JavaCore文件;
主要是基于不能在黑箱下分析问题,必须知道Tomcat当时在做什么;
JavaCore就可以反映出瞬时Java线程在作什么;
瞬间做什么不能说明问题,如果每次的JavaCore同一个线程都停留在同一行代码中,那么说明有问题
一般用jstack获取JavaCore
每隔1秒,输出一个JavaCore,总共输出50个JavaCore文件的Shell:
pids=`pgrep -f /home/MLF/TRS/jdk1.7.0_71/`
echo $pids
for (( c=1;c<=50;c++ ))
do
echo "操作系统密码" |sudo -S /home/MLF/TRS/jdk1.7.0_71/bin/jstack -l $pids > /home/MLF/TRS/TRSWCMV7/wcmlogs/javacore_$(date -d "yesterday" +"%Y%m%d%H%M%S")_$c.txt
# echo $c
#echo javacore_$(date -d "yesterday" +"%Y%m%d%H%M%S")_$c.txt
sleep 1
done
2.2 WCM在线产生Core的工具:
wcm/wcm_use/threaddump.jsp?count=2&interval=10
相关JSP:threaddump.jsp
3 如何分析javacore
javacore分析,很多时候是关心线程的数量及其状态,然后再对若干个别的线程栈进行分析。在javacore中,线程的状态可能是以下几种
状态意义
NEW未开始
RUNNABLE正在执行,可以简单理解为在Thread.run方法中
BLOCKED被阻塞。在等待必要的资源以进入执行状态。
WAITING等待
TIMED_WAITING休眠等待。可以简单理解为Thread.sleep
TERMINATED结束退出
一般来说,NEW/TERMINATED两个状态是较少见到的,而RUNNABLE、BLOCKED两个状态的线程是需要我们着重关注的。通常出现BLOCKED状态就是应用出现等待或挂起的地方。
借助一些工具来分析这个日志可以显著提高效率。
可以看一下内网实例分析thread dump热一下身先。然后,来认识一下jca工具。
4 JCA工具分析thread dump
JCA即Java Core Analyzer,是IBM出品的thread dump分析工具。其详细的使用介绍,见这里。
本节介绍一下compare thread的使用,以分析阻塞的线程。前面完成日志的获取后,运行打开工具,选择生成的日志文件即可。
打开日志后如图所示,是一个thread dump的列表,每一次的jstack输出就是一行。
为了使用compare threads,选中列表中的多行。按住Crtl键,点选其中的行即可。选择后,右键点击compare threads
在出来的结果中,关注其中颜色为绿边,红底的内容。绿边表示进程处理RUNNABLE状态(运行),红底标注表示多个thread dump中同一个进程的栈是没有变化的(在做同一件事)。
前面已经提到,我们在获取日志是以一定间隔进行的。如果在一个足够长的时间内,同一个进程的栈没有变化,就可以相信这个进程挂住,长时间没有完成,可能存在问题。然后通过相应的栈信息检查自己写的代码。(点击其中一个就可以在右边看到详细的栈信息)
5 什么时候应该获取javacore并分析
一句话:但凡应用出现等待都应该考虑获取javacore来分析应用到底是在哪里出现了等待或长时间没完成的任务而持有了相应的资源。如以下的一些情况:
用户无法登录。输入用户名/密码点击登录后,长时间不能完成登录。
文档发布慢,发布监控中待发队列内容较多,完成的发布队列时间比较长。(这个可能还会涉及到数据库/模板等的一些调优)
无法完成文档保存。点击保存后,一直读秒无法完成文档保存。
应用CPU占用一直很高