ITPub博客

首页 > 数字化转型 > ERP > ThreadDump

ThreadDump

原创 ERP 作者:531968912 时间:2016-07-11 10:24:40 0 删除 编辑


 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫javacore,或java dump)。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。

heap dump:

heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。

thread dump:

thread dump文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。thread dump是一个文本文件,打开后可以看到每一个线程的执行栈,以stacktrace的方式显示。通过对thread dump的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终导致系统崩溃。单个的thread dump文件一般来说是没有什么用处的,因为它只是记录了某一个绝对时间点的情况。比较有用的是,线程在一个时间段内的执行情况。
两个thread dump文件在分析时特别有效,困为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点的耗时是很大的。通过对这两个文件进行分析,查出原因,进而解决问题。


ThreadDump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的thread-dump的能力。虽然各个 Java虚拟机thread dump打印输出格式上略微有一些不同,但是Thread dumps出来的信息包含线程;线程的运行状态、标识和调用的堆栈;调用的堆栈包含完整的类名,所执行的方法,如果可能的话还有源代码的行数。


编辑摘要

ThreadDump - 什么是Thread Dump?

  Thread Dump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的thread-dump的能力。虽然各个 Java虚拟机thread dump打印输出格式上略微有一些不同,但是Thread dumps出来的信息包含线程;线程的运行状态、标识和调用的堆栈;调用的堆栈包含完整的类名,所执行的方法,如果可能的话还有源代码的行数。

ThreadDump - Thread Dump特点

  1. 能在各种操作系统下使用 

  2. 能在各种java应用服务器下使用 

  3. 可以在生产环境下使用而不影响系统的性能 

  4. 可以将问题直接定位到应用程序的代码行上

ThreadDump - Thread Dump能诊断的问题

  1. 查找内存泄露,常见的是程序里load大量的数据到缓存 

  2. 发现死锁线程

ThreadDump - SUN JVM 产生ThreadDump


1. Solaris OS

  -’\’ (Control-backslash) 

  kill -QUIT

2. HP-UX/UNIX/Linux

  Kill -3

3.Windows

  直接对MSDOS窗口的程序按Ctrl-break 

  有些Java应用服务器是在控制台上运行,如Weblogic,为了方便获取threaddump信息,在weblogic启动的时候,会将其标准输出重定向到一个文件,用"nohup ./startWebLogic .sh > log.out &"命令,执行"kill -3 ",Thread dump就会输出到log.out里。Tomcat的Thread Dump会输出到命令行控制台或者logs的catalina.out文件里。为了反映线程状态的动态变化,需要接连做三次以上thread dump,每次间隔10-20s。

ThreadDump - IBM JVM 产生Thread Dump

  在AIX上用IBM的JVM,内存溢出时默认地会产生javacore文件(关于cpu的)和heapdump文件(关于内存的)。 

  如果没有,则参照下列方法: 

  1. 在server启动前设置下面环境变量(可以加在启动脚本中) 

  export IBM_HEAPDUMP=true 

  export IBM_HEAP_DUMP=true 

  export IBM_HEAPDUMP_OUTOFMEMORY=true 

  export IBM_HEAPDUMPDIR= 

  2. 用set命令检查参数设置,确保没有设置DISABLE_JAVADUMP,然后启动server 

  3. 执行kill -3 命令可以生成javacore文件和heapdump文件

ThreadDump - 常见线程状态


IBM JVM常见线程状态

  在IBM JVM产生的javacore或者Threaddump文件中 

  Idle线程:一个已经准备好接受请求的线程,但是没有和插件或者客户端建立连接 

  Keep-Alive线程:是一个已经准备好接受请求的线程,并且已经和插件或者客户端建立连接 

  正在接受请求的线程:是一个线程正在读取request的内容或者头部

Sun JVM的常见线程状态

  对于thread dump信息,主要关注的是线程的状态和其执行堆栈 

  线程的状态一般为三类 

  Runnable(R):当前可以运行的线程 

  Waiting on monitor(CW):线程主动wait 

  Waiting for monitor entry(MW):线程等锁 

  一般关注的都是第一和第三种状态的线程 

  Cpu很忙则关注runnable的线程 

  Cpu闲则关注waiting for monitor entry的线程 

  一种典型的死锁是由于在server端应用(比如servlet)中请求由同一weblogic实例server的资源,解决办法就是将该servlet放到另外的执行队列里去执行 。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25462274/viewspace-2121808/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-09-24

  • 博文量
    576
  • 访问量
    1111413