一.dump基本概念

在故障定位(尤其是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文件在分析时特别有效,困为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点的耗时是很大的。通过对这两个文件进行分析,查出原因,进而解决问题。

二.利用JDK自带的工具获取thread dump文件和heap dump文件

使用的JDK工具在JDK_HOME/bin/目录下,使用到jmap和jstack这两个命令。

1.获取heap dump文件

windows下切换到JDK_HOME/bin/,执行以下命令:jmap -dump:format=b,file=heap.hprof 2576

linux下切换到JDK_HOME/bin/,执行以下命令:./jmap -dump:format=b,file=heap.hprof 2576

这样就会在当前目录下生成heap.hprof文件,这就是heap dump文件。

2.获取thread dump文件

windows下执行:jstack 2576 > thread.txt

linux下执行:./jstack 2576 > thread.txt

windows/linux则会将命令执行结果转储到thread.txt,这就是thread dump文件。有了dump文件后,我们就能借助性能分析工具获取dump文件中的信息。

3.如果我们只需要将dump中存活的对象导出,那么可以使用:live参数

jmap -dump:live,format=b,file=heapLive.hprof 2576

执行完后,我们在当前目录C:\Java\jdk1.6.0_27\bin下看到刚生成的三个文件,如下所示:

说明:如上实例的2576是我当前需要分析的java进程PID,关于Windows下如何获得指定的JAVA时空程PID可参考:http://bijian1013.iteye.com/blog/2221238

三.使用工具分析java heap dump文件

现在我们使用一些图形化工具,来帮助我们分析文件中的信息,有效地定位问题。

1.使用JDK自带的jhat命令

jhat是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

jhat -port 5000 heap.hrof

当服务启动完成后,我们就可以在浏览器中,通过http://localhost:5000/进行访问,如下所示:

2.使用eclipse MAT工具

一般来说,应用程序的dump文件都是很大的,jdk自带命令难以分析这些大文件。在实际的生产环境下,我们必须要借助第三方工具,才能快速打开这些大文件,进行分析定位。eclipse memory analyzer是一款优秀的heap分析工具,能够帮我们快速定位内存泄露问题。

java dumpheap_java程序性能分析之thread dump和heap dump相关推荐

  1. [Java]使用jConsole导出java程序的heap dump文件

    [Java]使用jConsole导出Java程序heap dump文件 Heap dump文件存储着在该文件生成时,Java程序的所有未被回收的Objects的信息.通过使用MAT工具,可以揪出内存泄 ...

  2. 生成 Heap Dump 的几种方式

    Heap Dump 概述 Heap Dump 是 Java进程所使用的内存情况在某一时间的一次快照.以文件的形式持久化到磁盘中. Heap Dump的格式有很多种,而且不同的格式包含的信息也可能不一样 ...

  3. linux java火焰图_Linux程序性能分析和火焰图

    Linux程序性能分析和火焰图 Linux程序的性能分析工具数量比较多,涉及到整个操作系统的方方面面,可能是开源的原因吧,相对于Windows来说丰富太多.其中应用分析性能方面Dtrace, Syst ...

  4. 认识Java Core和Heap Dump

    什么是Java Core和Heap Dump Java程序运行时,有时会产生Java Core及Heap Dump文件,它一般发生于Java程序遇到致命问题的情况下. 发生致命问题后,Java进程有时 ...

  5. jmap 文件解析_[Java基础] 使用JMAP dump及分析dump文件

    http://zhumeng8337797.blog.163.com/blog/static/100768914201242410583187/ 其中jmap是java自带的工具 查看整个JVM内存状 ...

  6. golang程序性能分析

    最近在使用GraphQL编写golang程序,但GraphQL框架在golang上的实践比较少,很多性能上的资料也不够全面.考虑到线上抗压的问题,笔者决定对自己开发的服务模块进行性能压测,评估下服务的 ...

  7. java heap分析工具_Java Heap dump文件分析工具jhat简介

    [开发.应用中老是会遇到OutOfMemory异常,而且常常是过一段时间内存才被吃光,这里可以利用java heap dump出jvm内存镜像,然后再对其进行分析来查找问题.<java heap ...

  8. Java heap dump及分析

    本文内容: 如何进行 heap dump MAT 的使用 object 的 Incoming 与 Outgoing References object 的 Shallow Size 与 Retaine ...

  9. 【Android】java.lang.AssertionError use looper thread, must call Looper.prepare() first!异常分析

    java.lang.AssertionError: use looper thread, must call Looper.prepare() first! 在消息处理中必须先调用Looper类的pr ...

最新文章

  1. 最全面的缓存架构设计
  2. linux c daemon 程序后台运行函数
  3. [轉]VS2010 SP1 TFS 2010 SP1 官方正式版下载
  4. LINUX ltrace命令-用来跟踪进程调用库函数的情况学习
  5. centos7;windows下安装和使用spice
  6. unity检测范围内敌人_Unity实现视野范围外死亡敌人的分数显示在屏幕内
  7. 信用指數旁的星星表示什麼?
  8. Java基础篇:嵌套 if 语句
  9. WPF 使用附加属性增加控件属性
  10. python中的或运算_python入门:if语句中的逻辑运算符
  11. sql server 配置管理器里为什么是32位_FT VIEW | SE高级应用之数据存入SQL数据库
  12. 阿里矢量库的图标使用教程(在线,下载)
  13. Android手机修改wifi图标,安卓手机怎么改wifi密码?
  14. 一行代码让图形秒变「手绘风」
  15. 搜索Instagram用户名API
  16. 群晖7.0搭建discuz论坛
  17. nginx日志统计pv、uv命令
  18. 九月的诗11首-光剑
  19. Android应用全屏显示
  20. 攻防世界高手进阶区 ——forgot

热门文章

  1. 外设驱动库开发笔记31:S-Modlue远红外气体传感器驱动
  2. iOS中frame和Bounds之间的区别
  3. 初探Backbone
  4. 现代软件工程讲义 5 项目经理 Program Manager
  5. python分行_基于python实现对文件进行切分行
  6. python 如何判断一个函数执行完成_Python 函数为什么会默认返回 None?
  7. jieba结巴分词--关键词抽取_结巴中文分词原理分析2
  8. 平移刚体上各点的加速度和速度_大物学习笔记(一)——刚体力学
  9. Java 程序员必须掌握的 Linux 命令
  10. larval+mysql+不等于_MySQL学习日记(19)比较运算符