• JVM jmap dump 分析dump文件 / 如何使用Eclipse MemoryAnalyzer MAT 排查线上问题


    jhat简介

    jhat用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言
    这个工具并不是想用于应用系统中而是用于"离线"分析。
    

    把本机的java内存映像导出到heap.dmp中,其中PID为java进程的ID号。

    jmap -dump:live,format=b,file=heap.dmp PID 
    

    导出后的映像文件可以用jhat来进行分析,-J是向java虚拟机传一个参数,如-mx768m是指定虚拟机可用最大的内存为768M。如果映像文件很大,你要指定一个很大的值,否则在分析过程中就会有OutOfMemeryError的错误。

    jhat heap.dmp
    如果报oom,可以通过参数-J-xmx768m 指定最大使用堆,例如:
    jhat -J-xmx768m -port <端口号:默认为7000> heap.dmp
    
    xxx@dev05:/data/logs/odin$  jhat -J-mx768m -port 7000 dump.log  
    Reading from dump.log ...
    Dump file created Thu Aug 30 14:26:51 CST 2018
    Snapshot read, resolving...
    Resolving 1046604 objects...
    Chasing references, expect 209 dots.................................................................................................................................................................................................................
    Eliminating duplicate references.................................................................................................................................................................................................................
    Snapshot resolved.
    Started HTTP server on port 7000
    Server is ready.
    

    不过还是Eclipse MemoryAnalyzer MAT好用的多, 他有方法栈调用关系,各个对象占用heap的大小,方便排查问题。

    首先介绍几个概念
    所有包含Heap Profling功能的工具(MAT, Yourkit, JProfiler, TPTP等)都会使用到两个名词,一个是Shallow Size,另一个是 Retained Size. 
    这是两个在平时不太常见的名词,本文会对这两个名词做一个详细的解释。 
    
    Shallow Size
    对象自身占用的内存大小,不包括它引用的对象。 
    针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。 
    针对数组类型的对象,它的大小是数组元素对象的大小总和。 
    
    Retained Size
    Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用) 
    换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。 
    不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。 
    



    如上图,功能不多做介绍,大家可以自己点一点,玩一下,我主要说排查问题的步骤及方式

    1. 点击file-> open dump file 来导入我们jmap dump 下来的堆栈信息文件
    2. 点击 top consumers-> 然后就会看到各种对象占用的大小,找到我们怀疑较大的对象(全类名)
    3. 左键点击List objects -> incoming 显示方法栈调用关系
    

    基本就能看出来是代码哪里出现内存泄露或代码哪里对象没有释放。
    比如线上的一个例子,有个AppendFile 对象有14w个之多,占了1.6G内存,full gc 无法回收。导致线上响应卡顿。
    接下来就是自己调试代码,解决相关问题了。后面我会上一些截图方便大家参考。

  • 相关阅读:
    SharePoint 2007图文开发教程(3)实现简单的WebPart
    ExtJS开发实践
    SharePoint 2007图文开发教程(2)使用SharePoint创建网站
    SharePoint 2007图文开发教程(1)简介,安装,配置及创建Web应用程序
    SharePoint 2007图文开发教程(6)实现Search Services
    回忆我们经典的开发工具
    SharePoint 2007图文开发教程(5)体验Event Handler
    常用Xpath对照表
    Oracle语句生成+存储过程测试工具发布:Easytran V0.1
    XML 路径语言(XPath) 版本 1.0
  • 原文地址:https://www.cnblogs.com/jiangxiaoxian/p/9559813.html
Copyright © 2020-2023  润新知