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

二、dump获取方式

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

1.获取heap dump文件

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

  • inux下切换到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下看到刚生成的三个文件,如下所示:
在这里插入图片描述

三、使用工具分析dump文件

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

3.1 使用JDK自带的jhat命令

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

执行命令:jhat -port 9010 heapLive.hprof
在这里插入图片描述

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

在这里插入图片描述

3.2 使用eclipse MAT工具

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

在这里插入图片描述

使用MAT进行案例分析:
https://blog.csdn.net/wanghuiqi2008/article/details/50724676

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dump分析死锁

1、制造死锁场景 一段死锁程序 public class DeadLock {public static Object lockA new Object();public static Object lockB new Object();public static void main(String[] args) {new ThreadA().start();new ThreadB().start();} }class ThreadA extends Thread {Ove…

用 C# 来守护 Python 进程

背景目前我主要负责的一个项目是一个 C/S 架构的客户端开发,前端主要是通过 WPF 相关技术来实现,后端是通过 Python 来实现,前后端的数据通信则是通过 MQ 的方式来进行处理。由于 Python 进程是需要依赖客户端进程来运行,为了保证…

针对媒体不实报道误导大众--抹黑C#工资垫底

近注意到一些媒体故意抹黑C# 工资垫底,参见 https://www.toutiao.com/i6741889572931633668/:通过搜索引擎搜索《编程语言薪酬排行:Python薪资最高,Java第二,C# 垫底》:早在2018年就出现这样的标题内容,还是CSDN公众号…

程序员你写的代码,被人挖出了黑产

事件经过看了微博上发表转发1000 、点赞1000次的吐槽陕西省的普通话成绩查询网站代码的微博,后来知乎上又有20万的阅读量这个话题的提问。最终结案这并不是真的陕西省普通话成绩查询网的网址,只不过是和官方查询一样的界面,李鬼”网站&#x…

Java垃圾回收日志解析

1.开启垃圾回收日志 在运行一个java程序时可以在命令行中加入相应的JVM垃圾回收参数,获取程序运行时详细的垃圾回收日志信息。以下是一些大概的参数: -XX:PrintGC与-verbose:gc 这两个命令效果都是一样,打印最基本的回收信息 -XX:PrintGCDe…

感谢有你们,架构师修行之路!

感谢有你们转眼马上就十月一了,听说今年的阵势非常强大,菜菜虽然身在北京,但是可能也目睹不了这个激动时刻了。自从2018年年底决定开始写公众号以来,几乎每个周末都在构思文章,撰写文章。关注公众号的老粉丝应该知道&a…

自定义构建基于.net core 的基础镜像

先说一个问题首先记录一个问题,今天在用 Jenkins 构建项目的时候突然出现包源的错误:/usr/share/dotnet/sdk/2.2.104/NuGet.targets(114,5): error : Unable to load the service index for source https: /usr/share/dotnet/sdk/2.2.104/NuGet.targets(…

操作系统——缓冲区溢出

一、缓冲区溢出介绍 1988年,世界上第一个缓冲区溢出攻击–Morris蠕虫在互联网上泛滥,短短一夜的时间全世界6000多台网络服务器瘫痪或半瘫痪,不计其数的数据和资料被毁。造成一场损失近亿美元的空前大劫难! 那么,缓冲…

从壹开始学习 NetCore 新篇章 ║ Blog.Core 开发社之招募计划书

宫哈喽大家好,国庆马上就要来了,在新的第四季度来临之际,祝大家年末能顺顺利利,解决所有的难题。大家可能从我的标题里也能看的出来,老张又要耍花样,搞事情了,近来随着 netcore 3.0 的正式推出&…

操作系统——内存管理——分段和分页

一、 物理地址和逻辑地址 物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地…

Kubernetes攻略之新手上路

在公有云、私有云和混合云的环境中,Kubernetes已经成为规模化部署容器应用的事实标准。最大的公有云平台AWS、谷歌云、Azure、IBM云和Oracle云目前都提供Kubernetes的管理服务(Managed Services)。各大互联网公司也开始将服务部署到Kubernete…

操作系统——深入理解虚拟内存机制

本文来自:https://www.jianshu.com/p/13e337312651 概述 现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空间。虚拟内存提供了以下的三个关键能力: 它为所有进程提…

dotNET Core 中怎样操作 AD?

做企业应用开发难免会跟 AD 打交道,在之前的 dotNET FrameWork 时代,通常使用 System.DirectoryServices 的相关类来操作 AD ,在 dotNET Core 中没有这个命名空间,在张善友大佬的推荐下,知道了 Novell.Directory.Ldap。…

操作系统——页面置换算法

一、页面置换算法简介 操作系统将内存按照页的进行管理,在需要的时候才把进程相应的部分调入内存。当产生缺页中断时,需要选择一个页面写入。如果要换出的页面在内存中被修改过,变成了“脏”页面,那就需要先写会到磁盘。页面置换…

在树莓派4上安装 .NET Core 3.0 运行时及 SDK

点击上方蓝字关注“汪宇杰博客”导语我最近买了个树莓派4,4GB内存高富帅配置,并安装了官方操作系统Raspbian。今天我成功运行了一个ASP.NET Core 3.0 应用程序。我们来看看怎么弄的吧~ARM32 还是 ARM64?需要说明的是,目前无法在树莓派 4 上运…

.NET生成漂亮桌面背景

前言一天,我朋友指着某某付费软件对我说,这个东西不错,每天生成一张桌面背景,还能学英语(放置名人名言和翻译)!我说,这东西搞不好我也能做,然后朋友说,“如果…

Mysql 执行流程

mysql执行一个查询的过程,到底做了些什么: 客户端发送一条查询给服务器;服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。服务器段进行SQL解析、预处理,在优化器生成…

Autofac的AOP面向切面编程研究

我的理解是 把系统性的编程工作封装起来 》我给这个取个名字叫 “Aspect”,然后通过AOP技术把它切进我们的业务逻辑代码 》 “业务“这样的好处:“Aspect” 和 “业务” 相互独立,既可以让“业务” 用到了 “Aspect” 又让2者互相独立不耦合&…

计算机网络原理梳理丨清晰认识 TCP/IP 协议,图解秒懂!

作者:MobMsg,资深全端工程师一枚,架构师社区合伙人!TCP/IP 协议族Internet 的核心协议就是 TCP/IP,广泛应用于局域网和广域网,目前已有20年发展史,是现用国际通行标准。TCP/IP 是个协议族&#…

MySQL 覆盖索引、最左前缀原则、索引下推

1、覆盖索引 1.1 概念 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。 1.2 判断标准 使用…