线程快照的相关内容介绍
Java线程堆栈是一个运行中的Java应用程序的所有线程的一个快照。它会显示一些像当前的堆栈跟踪、状态以及线程名称之类的信息。线程列表中包括由JVM本身创建的线程(负责垃圾收集、信号处理等管理工作)和由应用程序创建的线程。
一、做线程快照的方法
1、直接使用命令
l 在 windows环境中,
在启动程序的控制台里敲: Ctrl + Break,线程的 dump会产生在标准输出中( 缺省标准输出就是控制台,如果对输出进行了重定向,则要查看输出文件),之后需要将线程堆栈复制到文件中。
l 在 unix, linux和 MacOS 环境中,
在控制台中敲: Ctrl-\,或者,用 “kill -3 <pid>” ,或者 “kill – QUIT <pid>”。 Pid是用所关注的 JAVA进程号,您可以用 “ps -ef grep java” 找到,或者使用 JDK 5.0中的 “jps -v” 命令获得。(kill -3 <pid> 该命令会直接将线程快照显示在控制台上,注意一定要谨慎, 一步不慎就可能让服务器进程被杀死!)
l 在各个操作系统平台,都可以用 JDK 自带命令行工具包中的 jstack <pid> 。 (进入到jdk安装目录bin下,使用 ./jstack <pid> > dump.txt 可以线程快照重定向到文件中)
2、使用 VisualVM (推荐)-3-
VisualVM 是一个性能分析工具,自从 JDK 6 Update 7 以后已经作为 Oracle JDK 的一部分,位于 JDK 根目录的 bin 文件夹下。VisualVM 自身要在 JDK6 以上的版本上运行,但是它能够监控 JDK1.4 以上版本的应用程序。
打开方法:进入到jdk安装目录bin下,输入 ./jvisualvm , 即可打开该应用程序。
我们可以使用 VisualVM 的快照功能生成任意个性能分析快照并保存到本地来辅助我们进行性能分析。快照为捕获应用程序性能分析数据提供了一个很便捷的方式因为快照一旦生成可以在任何时候离线打开和查看,也可以相互传阅。
VisualVM 提供了两种类型的快照:
l Profiler 快照:当有一个性能分析会话(内存或者 CPU)正在进行时,我们可以通过性能分析结果工具栏的“快照”按钮生成 Profiler 快照捕获当时的性能分析数据。
图 1. Profiler 快照
l 应用程序快照:我们可以右键点击左侧 Applications 窗口中应用程序节点,选择“应用程序快照”为生成一个应用程序快照。应用程序快照会收集某一时刻的堆转储,线程转储和 Profiler 快照,同时也会捕获 JVM 的一些基本信息。
图 2. 应用程序快照
3、使用WebLogic 自带的获取 thread dump的工具:
1). 使用 Admin Console
a. 登录 Admin Console , 点击对应的服务器
b. 点击Server Monitoring Threads
c. 点击: Dump Thread Stack 按钮
2). 使用WLST (WebLogic Scripting Tool)
java weblogic.WLST
connect('weblogic','weblogic123','t3://dggtsebs01-vlx:7010')
cd('Servers')
cd('soa_server1')
threadDump()
disconnect()
exit()
注意: 线程堆栈将会保存在运行wlst的当前目录下.
WLST 脚本获取ThreadDump
① 创建WLST脚本:Threaddump.py
serverName = 'AdminServer'
counter = 0
sleepTime = 5000 #Threaddump时间间隔是5秒
connect ('weblogic','weblogic','t3://localhost:7001')
for counter in range(3): #做3个Threaddump
java.lang.Thread.sleep(sleepTime)
fileName = 'dump' + serverName + '_' + (java.util.Calendar.getInstance().getTimeInMillis()).toString() + '.dmp' #Threaddump文件名
threadDump('true', fileName, serverName)
② 调用脚本
java weblogic.WLST ThreadDumps.py
4、使用JProfiler:商业软件,需要付费。功能强大。
JProfiler是一款Java的性能监控工具。可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等),同时可以查找应用内存使用得热点,即:哪个对象占用的内存比较多;或者CPU热点,即:哪儿方法占用的较大得CPU资源
5、Jconsole :
JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,它是Java自带的简单性能监控工具,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。。下面以对tomcat的监控为例,带领大家熟悉Jconsole这个工具。
Step 1,在dos/bash命令下输入:jconsole;
Step 2,在弹出的对话框中选中apache,并点击connect(假设你的tomcat已经启动);
接下来,你就能使用jconsole来做一些简单的性能监控了。
JConsole监控系统内存变化情况,如果有内存溢出的话,垃圾回收将会呈现锯齿状。
二、分析线程快照的方法
1、IBM Thread and Monitor Dump Analyzer (TMDA)-8- (推荐)
分析一个或多个 Java 线程转储或 javacore(Javacore,也可以称为“threaddump”或是“javadump”,它是 Java 提供的一种诊断特性,能够提供一份可读的当前运行的 JVM 中线程使用情况的快照),并诊断监视器锁和线程活动,以便确定挂起、死锁和资源争用或监视器瓶颈的根源。
输入:用于显示相关线程历史记录的单个或多个 javacore ,如javacore.*.txt
输出:基于 GUI 的视图
使用该工具的问题类型:崩溃、挂起、性能瓶颈、JVM 意外终止
启动方法:<Java Runtime Environment path>java -Xmx500m -jar jca457.jar 或者 双击jca457.jar
2、HeapAnalyzer
HeapAnalyzer 读取单个 Java 内存转储(堆转储),并使您能够浏览转储以查看其内容。此工具是下面的 Memory Dump Diagnostic for Java (MDD4J) 工具(3) 的前身,后者现在包含前者的大多数功能。当时,HeapAnalyzer 中的原始树浏览功能比在 MDD4J 中更加灵活。另一方面,HeapAnalyzer 缺乏 MDD4J 中的某些更完善的泄露嫌疑检测算法,并且不支持多个转储的比较分析。
输入:单个 java 堆转储 ,如heapdump.txt
输出:可疑对象的图形视图和堆浏览器
支持:按原样提供的工具。
3、Memory Dump Diagnostic for Java (MDD4J)
分析正在运行 WebSphere Application Server 或任何其他独立 Java 应用程序的 JVM 中常见格式的内存转储(堆转储)。内存转储分析旨在确定 Java 堆中可能是内存泄露根源的数据结构。该分析还确定应用程序的 Java 堆占用空间的主要肇事者和它们的所属关系。此工具能够分析从遇到 OutOfMemoryError 问题的生产环境应用程序服务器中获得的非常大的内存转储(将需要 2 GB 或更多的 RAM)。MDD4J 扩展了上面较旧的 IBM HeapAnalyzer (2) 的功能,尽管两个工具的用户界面完全不同。
输入:来自虚拟机 (JVM) 的内存转储(堆转储)
输出:交互式报告,其中显示主要的内存泄露可疑之处,以及有关这些泄露的详细信息。
其他功能:操作单个转储。有些版本提供了多个转储的比较分析。
支持:此工具由 IBM 提供支持,目前是用于其所在领域的主要工具。
4、开源Thread Dump分析工具TDA (推荐)
开源免费的JVM TD日志分析工具, 支持JConsole和VisualVM插件.
相关演示视频:
http://www.beansoft.biz/wp-content/uploads/2011/08/tda.swf
三、其他参考资料
以下资料是对于上面的内容的补充与扩展。
1、JAVA线程dump的分析 --- jstack pid
http://www.blogjava.net/jzone/articles/303979.html
2、java虚拟机常用命令工具 http://learnworld.iteye.com/blog/1381949
3、使用 VisualVM 进行性能分析及调优
http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/
4、JVM调优工具 http://pengjiaheng.iteye.com/blog/552456
5、常用 Java Profiling 工具的分析与比较
http://www.ibm.com/developerworks/cn/java/j-lo-profiling/
6、Java自带的GUI性能监控工具Jconsole以及JvisualVM简介
http://blog.csdn.net/chendc201/article/details/22905503
7、 JProfiler试用手记 http://blog.csdn.net/chendc201/article/details/22905513
8、通过 Javacore 诊断线程挂起等性能问题 (TMDA介绍)
http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1406_tuzy_javacore/1406_tuzy_javacore.html
9、用于 JVM 生成的信息的工具
http://www.ibm.com/developerworks/cn/websphere/techjournal/0807_supauth/0807_supauth.html
10、使用WebLogic.Admin 做线程快照
http://blog.csdn.net/forest_hou/article/details/5468239
11、如何抓取Thread Dump小结
http://www.blogjava.net/beansoft/archive/2011/12/30/367584.html
12、使用VisualVM远程监控WebLogic服务器JVM http://www.beansoft.biz/?p=1809
13、开源Thread Dump分析工具TDA http://www.beansoft.biz/?p=2121
14、JDK的几种分析工具 http://blog.csdn.net/hantiannan/article/details/4651617