Written by
arstercz
-
监控及解析java thread信息
参考
java-thread-monitor-and-dumper”
jstack-profiler
jvm-tools
监控 java thread
脚本通过 jstack 打印java 进程中的线程信息, 为避免进程重启带来的影响, 脚本通过选项 procuniqueid 唯一标识进程, 再通过标识跟踪相应 java 进程的信息. 该脚本可以很好的跟踪 java thread 线程持续增加的情况.
使用:
# su - <user_of_javaprocess>
# export JAVA_HOME=/opt/jdk/
# ./process-monitor-for-java-threads.sh -procuniqueid 'appnameunique_string' -checkinterval 1 -threaddumpmaxbackup 50 -ulimitmaxprocThreadDumpStart 500
默认每分钟打印一次 jstack 信息, 持续一个小时, java 线程数超过 500 就调用 jstack 打印输出, 输出信息存到脚本所在目录. 详细参数见 ./process-monitor-for-java-threads.sh -h
解析 jstack 输出信息
可以人工阅读输出信息排错, 也可使用脚本 jstack-profiler 统计分析 jstack 输出内容, 获取概要信息. 该脚本分析 jstack 的结果信息, 和上述的监控可以配合使用;
# /opt/jdk/bin/jstack -l 23056 > cat 23056.txt
# cat 23056.txt | /opt/jdk/bin/java -jar jstack-profiler-assembly-0.2.jar
Runnable methods breakout
-------------------------
rank time name
0 90.00% java.lang.Thread.run(Thread.java:722)
1 70.00% com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:743)
2 70.00% com.caucho.util.ThreadPool$Item.run(ThreadPool.java:662)
3 50.00% com.caucho.server.port.Port.accept(Port.java:1179)
...
...
Blocked/Waiting methods breakout
--------------------------------
rank time name
0 99.64% java.lang.Thread.run(Thread.java:722)
1 76.68% java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
2 76.68% com.promained.user.log.manager.MobileStatManager.access$000(MobileStatManager.java:66)
3 76.68% com.promained.user.log.manager.MobileStatManager$1.run(MobileStatManager.java:225)
4 76.68% java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
对 jstack 输出做的统计分析, rank 表示排名, time为 name 在jstack结果中出现次数的比率; 按照运行状态分类, 分类信息包括:
case "NEW" => New
case "RUNNABLE" => Runnable
case "BLOCKED" => Blocked
case "WAITING" => Waiting
case "TIMED_WAITING" => TimedWaiting
case "TERMINATED" => Terminated
case _ => throw new IllegalArgumentException("Bad thread state: '" + string + "'")
jvm-tools
更全面的监控工具, 使用见: ttop-command