十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
一、Thread Dump介绍
创新互联公司专注于企业营销型网站建设、网站重做改版、罗定网站定制设计、自适应品牌网站建设、H5技术、商城网站定制开发、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为罗定等各大城市提供网站开发制作服务。
1.1什么是Thread Dump?
Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机打印的thread dump略有不同,但是大多都提供了当前活动线程的快照,及JVM中所有Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话还有源代码的行数。
1.2 Thread Dump特点
1. 能在各种操作系统下使用
2. 能在各种Java应用服务器下使用
3. 可以在生产环境下使用而不影响系统的性能
4. 可以将问题直接定位到应用程序的代码行上
1.3 Thread Dump 能诊断的问题
1. 查找内存泄露,常见的是程序里load大量的数据到缓存;
2. 发现死锁线程;
1.4如何抓取Thread Dump
一般当服务器挂起,崩溃或者性能底下时,就需要抓取服务器的线程堆栈(Thread Dump)用于后续的分析. 在实际运行中,往往一次 dump的信息,还不足以确认问题。为了反映线程状态的动态变化,需要接连多次做threaddump,每次间隔10-20s,建议至少产生三次 dump信息,如果每次 dump都指向同一个问题,我们才确定问题的典型性。
有很多方式可用于获取ThreadDump, 下面列出一部分获取方式:
操作系统命令获取ThreadDump:
Windows:
1.转向服务器的标准输出窗口并按下Control + Break组合键, 之后需要将线程堆栈复制到文件中;
UNIX/ Linux:
首先查找到服务器的进程号(process id), 然后获取线程堆栈.
1. ps –ef | grep java
2. kill -3 pid
注意:一定要谨慎, 一步不慎就可能让服务器进程被杀死。kill -9 命令会杀死进程。
JVM 自带的工具获取线程堆栈:
JDK自带命令行工具获取PID,再获取ThreadDump:
1. jps 或 ps –ef|grepjava (获取PID)
2. jstack [-l ]pid | tee -a jstack.log (获取ThreadDump)
二、java线程的状态转换介绍(为后续分析做准备)
2.1 新建状态(New)
用new语句创建的线程处于新建状态,此时它和其他Java对象一样,仅仅在堆区中被分配了内存。
2.2 就绪状态(Runnable)
当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态,Java虚拟机会为它创建方法调用栈和程序计数器。处于这个状态的线程位于可运行池中,等待获得CPU的使用权。
2.3 运行状态(Running)
处于这个状态的线程占用CPU,执行程序代码。只有处于就绪状态的线程才有机会转到运行状态。
2.4 阻塞状态(Blocked)
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU。直到线程重新进入就绪状态,它才有机会转到运行状态。
阻塞状态可分为以下3种:
1)位于对象等待池中的阻塞状态(Blocked in object’s wait pool):当线程处于运行状态时,如果执行了某个对象的wait()方法,Java虚拟机就会把线程放到这个对象的等待池中,这涉及到“线程通信”的内容。
2)位于对象锁池中的阻塞状态(Blocked in object’s lock pool):当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他线程占用,Java虚拟机就会把这个线程放到这个对象的锁池中,这涉及到“线程同步”的内容。
class-dump-x 提取私有库里面的隐藏文件
class-dump
This is a command-line utility for examining the Objective-C runtime information stored in Mach-O files. It generates declarations for the classes, categories and protocols. This is the same information provided by using 'otool -ov', but presented as normal Objective-C declarations, so it is much more compact and readable.
Why use class-dump?
It's a great tool for the curious. You can look at the design of closed source applications, frameworks, and bundles. Watch the interfaces evolve between releases. Experiment with private frameworks, or see what private goodies are hiding in the AppKit. Learn about the plugin API lurking in Mail.app.
If you find class-dump useful, you can donate to help support its development. Thanks!
Download
Current version: 3.3.3 (Universal, 64 and 32 bit)
Requires Mac OS X 10.5 or later.
class-dump-3.3.3.dmg
class-dump-3.3.3.tar.gz
class-dump-3.3.3.tar.bz2
Changes - News
Contact
You can email questions and bug reports to me at class-dump@codethecode.com, or nygard at gmail.com.
Usage
class-dump 3.3.3 (64 bit)
Usage: class-dump [options] mach-o-file
where options are:
-a show instance variable offsets
-A show implementation addresses
--arch arch choose a specific architecture from a universal binary (ppc, ppc7400, ppc64, i386, x86_64, etc.)
-C regex only display classes matching regular expression
-f str find string in method name
-H generate header files in current directory, or directory specified with -o
-I sort classes, categories, and protocols by inheritance (overrides -s)
-o dir output directory used for -H
-r recursively expand frameworks and fixed VM shared libraries
-s sort classes and categories by name
-S sort methods by name
-t suppress header in output, for testing
--list-arches list the arches in the file, then exit
--sdk-root specify the SDK root path (full path, or 4.1, 4.0, 3.2, 10.6, 10.5, 3.1.3, 3.1.2, 3.1)
License
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
class-dump -H /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.1.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard
-o
~/Desktop/SpringBoard
使用:
1 将下载好的 class-dump 放入usr/local/bin 下.
如果 ‘/usr/local/bin’ 不知道在哪里,可以在terminal 下输入 ‘open -a Finder /usr/local/bin’ 以便打开目录.
记着 class-dump 要 使用 chmod 修改下执行权限. 例如:在usr/local/bin 对 class-dump 修改,可以这 样在terminal 切换到 usr/local/bin 目录下: chmod 777 class-dump .
2 将DumpFrameworks.pl 放入任意目录下.同样需要修改执行权限.
3. OK..现在所有的准备工作作好了. 我们在 terminal 的任意目录下 输入 : ./DumpFrameworks.pl
等待...
会有一个Heards 文件夹在你的主目录下. 里面包含了 Frmeworks 和 privateFrameworks 下所有的私有 API,尽情享用吧.!
java dump heap 是分配给实例类和数组对象运行数据区,所有java线程在运行期间共享heap中的数据。Java heap dump相当于java应用在运行的时候在某个时间点上打了个快照(snapshot)。
有java dump文件生成的方式如下:
1.使用$JAVA_HOME/bin/jmap -dump来触发,eg:jmap -dump:format=b,file=/home/longhao/heamdump.out
2.使用$JAVA_HOME/bin/jcosole中的MBean,到MBeancom.sun.managementHotSpotDiagnostic操作dumpHeap中,点击 dumpHeap按钮。生成的dump文件在java应用的根目录下面。
3.在应用启动时配置相关的参数 -XX:+HeapDumpOnOutOfMemoryError,当应用抛出OutOfMemoryError时生成dump文件。
4.使用hprof。启动虚拟机加入-Xrunhprof:head=site,会生成java.hprof.txt文件。该配置会导致jvm运行非常的慢,不适合生产环境。
jmap是java自带的工具
1. 查看整个JVM内存状态
jmap -heap [pid]
2. 查看JVM堆中对象详细占用情况
jmap -histo [pid]
3. 导出整个JVM 中内存信息,可以利用其它工具打开dump文件分析,例如jdk自带的visualvm工具
jmap -dump:file=文件名.dump [pid]
当服务器挂起,崩溃或者性能底下时,就需要抓取服务器的线程堆栈(Thread Dump)用于后续的分析.
Thread dump提供了当前活动的线程的快照. 它提供了JVM中所有Java线程的栈跟踪信息
有很多方式可用于获取Thread Dump, 一些是操作系统特定的命令.
操作系统命令获取ThreadDump:
Windows:
1. 转向服务器的标准输出窗口并按下Control + Break组合键, 之后需要将线程堆栈复制到文件中
UNIX/ Linux
首先查找到服务器的进程号(process id), 然后获取堆栈.
1. ps –ef | grep java
2. kill -3 pid
注意一定要谨慎, 一步不慎就可能让服务器进程被杀死!
JVM 自带的工具获取线程堆栈:
JDK自带命令行工具获取PID并做ThreadDump:
1. jps
2.jstack pid
使用JVisualVM:
Threads 标签页 →ThreadDump按钮
WebLogic 自带的获取 thread dump的工具:
1. webLogic.Admin 工具
a. 打开命令提示符, 通过运行DOMAIN_HOME/bin/setDomain.env设置相关类路径
b. 执行下面的命令
java weblogic.Admin -url t3://localhost:7001 -username weblogic -password weblogic1 THREAD_DUMP
注意: Thread Dump 会打印到标准输出, 如nohup日志或者进程窗口.
2. 使用 Admin Console
a. 登录 Admin Console , 点击对应的服务器
b. 点击Server à Monitoring àThreads
c. 点击: Dump Thread Stack 按钮
3. 使用WLST (WebLogic Scripting Tool)
connect(‘weblogic’,'weblogic1’,’t3://localhost:7001’)
cd(‘Servers’)
cd(‘AdminServer’)
threadDump()
disconnect()
exit()
注意: 线程堆栈将会保存在运行wlst的当前目录下.
4. 使用utils.ThreadDumper
用法:
C:\bea\wlserver_10.3\server\libjava -cp weblogic.jar utils.ThreadDumper
Broadcast Thread dumps disabled: must specify weblogic.debug.dumpThreadAddr and
weblogic.debug.dumpThreadPort
Exception in thread "main" java.lang.IllegalArgumentException: Port out of range
:-1
at java.net.DatagramPacket.setPort(Unknown Source)
at java.net.DatagramPacket.init(Unknown Source)
at java.net.DatagramPacket.init(Unknown Source)
at utils.ThreadDumper.sendDumpMsg(ThreadDumper.java:124)
at utils.ThreadDumper.main(ThreadDumper.java:145)
5. 如果服务器是作为Windows服务的方式运行, 请运行下列命令:
WL_HOME\bin\beasvc -dump -svcname:service-name
其它一些获取Thread Dump的工具有jrcmd, jrmc(JRockit VM自带) ,Samurai, JProfiler等, 还可通过JMX编程的方式获取, 如JDK自带示例代码:
$JAVA_HOME\demo\management\FullThreadDump