- 1 一、Thread Dump介绍
- 1.1 1.1什么是Thread Dump?
- 1.2 1.2 Thread Dump特点
- 1.3 1.3 Thread Dump 能诊断的问题
- 1.4 1.4如何抓取Thread Dump
- 2 二、java线程的状态转换介绍(为后续分析做准备)
- 2.1 2.1 新建状态(New)
- 2.2 2.2 就绪状态(Runnable)
- 2.3 2.3 运行状态(Running)
- 2.4 2.4 阻塞状态(Blocked)
- 2.5 2.5 死亡状态(Dead)
- 3 三、Thread Dump分析
- 3.1 3.1 首先介绍一下Thread Dump信息的各个部分
- 3.2 3.2 JVM线程介绍
- 4 四、案例分析:
- 4.1 4.1、使用方案
- 5 heapdump
- 5.1 什么是 Java heap dump
- 5.2 触发 Java heap dump
- 5.3 分析 Java heap dump
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
2.1 新建状态(New)
用new语句创建的线程处于新建状态,此时它和其他Java对象一样,仅仅在堆区中被分配了内存。
2.2 就绪状态(Runnable)
当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态,Java虚拟机会为它创建方法调用栈和程序计数器。处于这个状态的线程位于可运行池中,等待获得CPU的使用权。
2.3 运行状态(Running)
处于这个状态的线程占用CPU,执行程序代码。只有处于就绪状态的线程才有机会转到运行状态。
2.4 阻塞状态(Blocked)
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU。直到线程重新进入就绪状态,它才有机会转到运行状态。
阻塞状态可分为以下3种:
2.5 死亡状态(Dead)
当线程退出run()方法时,就进入死亡状态,该线程结束生命周期。
通过前面1.4部分的方法,获取Thread Dump信息后,对其进行分析;
3.1 首先介绍一下Thread Dump信息的各个部分
2) 线程状态详解: Runnable _The thread is either running or ready to run when it gets its CPU turn._
3.2 JVM线程介绍
4.1、使用方案
cpu飙高,load高,响应很慢 方案: * 一个请求过程中多次dump * 对比多次dump文件的runnable线程,如果执行的方法有比较大变化,说明比较正常。如果在执行同一个方法,就有一些问题了。 查找占用cpu最多的线程信息 方案: * 使用命令: top -H -p pid(pid为被测系统的进程号),找到导致cpu高的线程id。 上述Top命令找到的线程id,对应着dump thread信息中线程的nid,只不过一个是十进制,一个是十六进制。 * 在thread dump中,根据top命令查找的线程id,查找对应的线程堆栈信息。 cpu使用率不高但是响应很慢 方案: * 进行dump,查看是否有很多thread struck在了i/o、数据库等地方,定位瓶颈原因。 请求无法响应 方案: * 多次dump,对比是否所有的runnable线程都一直在执行相同的方法,如果是的,恭喜你,锁住了!
什么是 Java heap dump
首先需要搞懂什么是java heap,java heap是分配给实例类和数组对象运行数据区,所有java线程在运行期间共享heap中的数据。Java heap dump相当于java应用在运行的时候在某个时间点上打了个快照(snapshot)。
触发 Java heap dump
有以下方法出发heap dump
使用$JAVA_HOME/bin/jmap -dump来触发,eg:jmap -dump:format=b,file=/home/longhao/heamdump.out 使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun.management>HotSpotDiagnostic>操作>dumpHeap中,点击 dumpHeap按钮。生成的dump文件在java应用的根目录下面。 在应用启动时配置相关的参数 -XX:+HeapDumpOnOutOfMemoryError,当应用抛出OutOfMemoryError时生成dump文件。 使用hprof。启动虚拟机加入-Xrunhprof:head=site,会生成java.hprof.txt文件。该配置会导致jvm运行非常的慢,不适合生产环境。
分析 Java heap dump
1:使用IBM HeapAnalyzer
IBM HeapAnalyzer是一款免费的JVM内存堆的图形分析工具,它可以有效的列举堆的内存使用状况,帮助分析Java内存泄漏的原因。
2:jhat
3:Eclipse MemoryAnalyzer
Eclipse Memory Analyzer是一个快速并且功能强大的Java heap分析器,能够帮助你查找内存泄漏和减少内存消耗。在File>Acquire Heap Dump>configure>HPROF jmap dump provider设置一下分析应用的JDK,点击相关应用列表来生成heap dump并分析。
在socket,nio中的有些API中,申请的内存是直接想OS要的,在堆中分析内存是查看不到的,可以通过-XX:MaxDirectMemorySize=来设置应用向OS直接申请的最大内存数。
到此这篇jvisualvm分析dump文件(jvm dump路径)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/jszy-jszl/57139.html