当前位置: 首页 > news >正文

java dump heap_java程序性能分析之thread dump和heap dump

一.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

77a64d96530fad14f2958f18464d0ed4.png

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

cc3612ccb315d103df1e8a4747896b1d.png

说明:如上实例的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

b1a35e451095660ff2b72f97574b84d3.png

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

d3b2cbb6fc067916addc125c93cd1001.png

2.使用eclipse MAT工具

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

相关文章:

  • java main命令行参数_关于java的main主入口方法的args字符串数组参数如何使用及命令行模拟实现...
  • java友元类_C++友元(Friend)用法实例简介
  • java form array_Java中数组操作 java.util.Arrays 类常用方法的使用
  • java类名的作用_java下Class.forName的作用是什么,为什么要使用它?
  • Java同步问题_Java中的同步问题
  • ubuntu php 编译安装mysql_ubuntu 8.04 编译安装 php mysql apache
  • java 构造器 this_Java 类的构造器中this()和super()的困惑
  • java为什么输入else错误_java – 我遇到了一个错误问题,我正在使用“else if”语句....
  • java antlr sql_ANTLR SQL解析器代码
  • java cms gc_G1,CMS及PARALLEL GC的比较
  • java以class开头_JAVA基础:从.class文件中寻找类名
  • Java 习题6 参考答案及解析_java期末复习题答案及解析
  • 猜字小游戏java方法体_java实现猜字小游戏
  • java游戏开发包_LWJGL
  • java的人patch方法_java – 如何在CXF中使用PATCH方法
  • (三)从jvm层面了解线程的启动和停止
  • Angular2开发踩坑系列-生产环境编译
  • Asm.js的简单介绍
  • Brief introduction of how to 'Call, Apply and Bind'
  • CSS居中完全指南——构建CSS居中决策树
  • css选择器
  • Django 博客开发教程 8 - 博客文章详情页
  • js
  • pdf文件如何在线转换为jpg图片
  • Redux 中间件分析
  • Terraform入门 - 3. 变更基础设施
  • 编写高质量JavaScript代码之并发
  • 关于springcloud Gateway中的限流
  • 试着探索高并发下的系统架构面貌
  • 找一份好的前端工作,起点很重要
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #stm32驱动外设模块总结w5500模块
  • (10)ATF MMU转换表
  • (13):Silverlight 2 数据与通信之WebRequest
  • (6)设计一个TimeMap
  • (BFS)hdoj2377-Bus Pass
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (算法设计与分析)第一章算法概述-习题
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • 、写入Shellcode到注册表上线
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [14]内置对象
  • [AIGC 大数据基础]hive浅谈
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C++]unordered系列关联式容器
  • [CentOs7]搭建ftp服务器(2)——添加用户