监控及解析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