精华内容
下载资源
问答
  • JVM dumpjava内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢?我们一步一步来获取JVM dump...

    JVM dump

    java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢?我们一步一步来

    获取JVM dump文件

    获取dump文件的方式分为主动和被动

    i.主动方式:

    1.利用jmap,也是最常用的方式:jmap -dump:[live],format=b,file=

    2.利用jcmd,jcmd GC.heap_dump

    3.使用VisualVM,可以界面操作进行dump内存

    4.通过JMX的方式

    MBeanServer server = ManagementFactory.getPlatformMBeanServer();

    HotSpotDiagnosticMXBean mxBean = ManagementFactory.newPlatformMXBeanProxy(server, "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class);

    mxBean.dumpHeap(filePath, live);

    ii.被动方式:

    被动方式就是我们通常的OOM事件了,通过设置参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=

    dump文件分析

    结构示意图

    97ecf2a4288ffb3721d90def154cde34.png

    结构详解

    dump文件是堆内存的映射,由文件头和一系列内容块组成

    文件头

    由musk, 版本,identifierSize, 时间4部分组成

    1、musk:4个byte,内容为'J', 'A', 'V', 'A'即JAVA

    2、version:若干byte,值有以下三种

    " PROFILE 1.0\0",

    " PROFILE 1.0.1\0",

    " PROFILE 1.0.2\0"

    3、identifierSize:4个byte数字,值为4或者8,表示一个引用所占用的byte数

    4、time:8个byte,dump文件生成时间

    说明:java一个类的成员变量有两种类型基本类型(8种基本类型),它们占用byte数固定不变,每生成一个对象它们就需要给它们赋初始值,分配空间

    是引用类型,表示一个对象,在类中只有一个引用,引用只是一个数值,所占用的空间大小为identifierSize,被引用对象即将在堆中的另一个地方

    例如定义一个类

    public class Person {

    private int age;//4个byte

    private String name;//identifierSize个byte

    private double weight;//8个byte

    }

    当我们在new Person()的时候

    它就需要申请一个空间,空间大小为 对象头大小+4+identifierSize+8个byte

    对象大小的测量:

    jdk提供一个测试对象占用内存大小的工具Instrumentation,但是Instrumentation没法直接引用到,需要通过agent来引用到

    定义一个Premain类, javac Premain.java

    //Premain.java

    public class Premain {

    public static java.lang.instrument.Instrumentation inst;

    public static void premain(String args, java.lang.instrument.Instrumentation inst) {

    Premain.inst = inst;

    }

    }

    编写一个Manifest文件

    manifest.mf

    Manifest-Version: 1.0

    Premain-Class: Premain

    Can-Redefine-Classes: true

    Can-Retransform-Classes: true

    打包

    jar -cmf manifest.mf premain.jar Premain.class

    定义一个执行类, javac PersonTest.java

    //PersonTest.java

    public class PersonTest {

    public static void main(String[] args) throws Exception {

    Class clazz = Class.forName("Premain");

    if (clazz != null) {

    Person p = new Person();

    java.lang.instrument.Instrumentation inst = (java.lang.instrument.Instrumentation)clazz.getDeclaredField("inst").get(null);

    System.out.println("person size:[" + inst.getObjectSize(p) + "]B");

    System.out.println("class size:[" + inst.getObjectSize(p.getClass()) + "]B");

    }

    }

    }

    带agent执行

    java -javaagent:premain.jar PersonTest

    结果:

    person size:[32]B

    class size:[504]B

    内容块

    每个块都是块头和块体组成

    块头

    块头由1个byte的块类型,4个byte的时间time,4个byte的长度表示此内容块占用byte数

    type类型一般有5种,字符串,类,栈桢,栈,及dump块字符串,由identifierSize个byte的字符串id,后面是(length-identifierSize)个byte的字符串内容(后续对字符串是直接引用的这里面的id)

    类,由4个byte的类序列(在栈桢中使用),identifierSize个byte的类id(解析类的时候用到),4个byte的序列id(暂未使用),identifierSize个byte的类名id

    栈桢,由identifierSize个byte的桢id,identifierSize个byte的方法名id,identifierSize个byte的方法标识id,identifierSize个byte的类文件名id,4个byte的类序列,4个byte的行号

    栈,由4个byte的栈序号,4个byte的线程序号,4个byte的桢数量,后面就是若干个identifierSize个byte的桢id

    dump块就是所有对象的内容了,每个对象由1个byte的子类型,和对象内容结成,子类型有6种,gc root, 线程对象,类,对象,基本类型数组,对象数组

    gc root

    gc root有4种结构,8种类型identifierSize个byte的对象id,类型有SYSTEM_CLASS,BUSY_MONITOR, 及未UNKNOWN

    identifierSize个byte的对象id,4个byte的线程序列号,类型有NATIVE_STACK,THREAD_BLOCK

    identifierSize个byte的对象id,4个byte的线程序列号,4个byte的栈桢深度,类型有JAVA_LOCAL,NATIVE_LOCAL

    identifierSize个byte的对象id,identifierSize个byte的global refId(暂未使用),类型有NATIVE_STATIC

    gc root示意图

    gc root为垃圾收集追溯的源头,每个gc root都指向一个初始对象,无法追溯的对象是要被回收掉的

    c95c66e65584f2154f57714631b77b54.png

    系统类,只有classLoader为null的类才是gc root,每个类都是一个gc root

    线程栈,线程中方法参数,局部变量都是gc root,每个对象都是一个gc root

    系统保留对象,每个对象都是一个gc root

    类对象

    1、基本信息:identifierSize个byte的类对象id

    4个byte的栈序列号,

    identifierSize个byte的父类对象id,

    identifierSize个byte的classLoader对象id,

    identifierSize个byte的Signer对象id,

    identifierSize个byte的protection domain对象id,

    identifierSize个byte的保留id1和id2,

    4个byte的类实例对象大小,

    2个byte的常量个数,后面是每个常量的,2个byte的下标,1个byte的常量类型,和若干个byte的内容,内容根据类型来决定(boolean/byte为1个byte,

    char/short为2个byte,float/int为4个byte,

    double/long为8个byte,引用类型为identifierSize个byte)

    2个byte的静态变量个数,后面是每个静态变量的,identifierSize个byte的变量名id, 1个byte的变量类型,和若干个byte的内容,内容根据类型来决定(见类对象基本信息的第9条)

    2个byte的成员变量个数,后面是每个成员变量的,identifierSize个byte的变量名id,1个byte的变量类型

    2、说明:

    (1)类里面的常量很多地方都没有用上,所以常量个数一般为0

    (2)类的静态变量的名称类型及值是放在类对象里面的,成员变量的名称和类型也是放在类对象里面的,但是实例的值是放在实例对象里面的

    实例对象

    1、基本信息:identifierSize个byte的实例对象id

    4个byte的栈序列号

    identifierSize个byte的类id

    4个byte的占用字节数

    实例的变量的值

    2、说明:实例的值为实例对象的成员变量值,顺序为当前类的变量值,顺序为类对象基本信息中第11条中的顺序,然后是父类的变量值

    变量的值基本类型都有默认值,引用类型默认值为0,占用字节数(见类对象基本信息的第9条)

    基本类型数组

    1、基本信息:identifierSize个byte的数组对象id

    4个byte的栈序列号

    4个byte的数组长度

    1个byte的元素类型

    元素的值列表

    2、说明:元素的值(见类对象基本信息的第9条)

    对象数组

    1、基本信息:identifierSize个byte的数组对象id

    4个byte的栈序列号

    4个byte的数组长度

    identifierSize个byte的元素类id

    元素的值列表

    内存分配

    212b7ea61271bca5d84d158a718e7fe2.png

    当一个线程启动的时候,进程会去系统内存生成一个线程栈

    每当发生一次方法调用,就会向栈中压入一个栈桢,当方法调用完之后,栈桢会退出

    在运行过程中,如果有对象的new操作的时候,进程会去堆区申请一块内存

    关于运行时内存的详细情况,可以查找相关的资料

    内存回收规则

    如果一个对象不能骑过gc root引用可达,那么这个对象就可能要被回收

    对象回收规则包括

    展开全文
  • 查看jvm内存快照

    2019-09-30 12:10:00
    jmap -dump:live,format=b,file=m.hprof PID 转载于:https://www.cnblogs.com/yangxiaochu/p/11606595.html

    jmap -dump:live,format=b,file=m.hprof PID

    转载于:https://www.cnblogs.com/yangxiaochu/p/11606595.html

    展开全文
  • 1、场景通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出.对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策。...配置jvm参数-XX:+HeapDumpOnOutOfMe...

    1、场景

    通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出.

    44769fffe9098d1d895f163ba2336bbf.png

    对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策。

    这时候怎么办呢?可以使用linux下的mat,既Memory Analyzer Tools

    2、dump生成

    dump可以是内存溢出时让其自动生成,或者手工直接导。配置jvm参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/biapp/m.hprof

    手工直接导,PID为进程号

    jmap -dump:live,format=b,file=m.hprof PID

    3、准备工作,下载LINUX的MAT

    在linux服务器执行命令 uname –m查看版本

    a5f789f0a721be16e401a1c78c23b7a5.png

    下载对应的版本

    c19763d00031a09e871a9139df128a87.png

    下载后将包传到linux服务器上解压。

    af2926363870ae814071c12c10ecd44b.png

    MemoryAnalyzer.ini 配置文件可以修改最大的内存,默认1G基本够用了。

    4、在linux执行分析命令

    执行命令

    ./ParseHeapDump.sh m.hprof  org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components。

    m.hprof就是jvm的dump文件,在mat目录下会生成3份.zip结尾的报告和一些m.相关的文件,将生成的m.hprof相关的文件都下载到windows本地磁盘。

    如:

    1407d6133c70cd777edcfdbcb4590c05.png

    5、打开分析报告

    1)使用浏览器

    解压缩以.zip结尾的文件,解压后

    324f5521343f9153ced9178b7f48b304.png

    使用浏览器打开index.html文件内容,查看分析报告

    c74e35be0b48e0674bd3b89748fecff2.png

    查看Class Histogram一项

    4cc3b352c3c84363a491dc678f1f26af.png

    发现其中一个类对象占用了7个G,这里的Heap单位都是Byte,自行换算。

    Shallow Heap 既对象本身的大小

    Retained Heap 对象自身加起直接或间接引用的大小

    2)使用eclipse的mat工具

    Eclipse需要按照mat工具,安装步骤可以百度,或者参考

    如果直接打开dump文件还是会内存溢出,所以可以使用eclipse打开分析报告即可。

    使用eclipse-File-Open File打开dump文件,如下:

    c87638babf9a9eda4f8496eca879cc41.png

    会提示错误,点击OK忽略错误,然后选择第三项,重新打开之前的运行报告

    894736452c354b25f15fa4ff422f4275.png

    点击Next,出现如下界面

    fa94fbe5e5d9827697fc014e34ae11cd.png

    选择其中的一份报告打开,如m_System_Overview.zip

    c248f744a563b5b072cc62d90bd3b493.png

    得到相同的结果

    1f3fa1bf15c7268e89409e31907b53b1.png

    展开全文
  • 1、场景通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出. 对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策。...配置jvm参数-XX:+HeapDumpOnOutOfM...

    1、场景

    通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出.

    92936cc516d3aaa1e3a1c97d8d852bc1.png

    对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策。

    这时候怎么办呢?可以使用linux下的mat,既Memory Analyzer Tools

    2、dump生成

    dump可以是内存溢出时让其自动生成,或者手工直接导。配置jvm参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/biapp/m.hprof

    手工直接导,PID为进程号

    jmap -dump:live,format=b,file=m.hprof PID

    3、准备工作,下载LINUX的MAT

    在linux服务器执行命令 uname –m查看版本

    6adacc0acef23d7f2f99800ed10773e5.png

    下载对应的版本

    3f977e70ee62a69987b7d1ce2cc6e1ce.png

    下载后将包传到linux服务器上解压。

    af2926363870ae814071c12c10ecd44b.png

    MemoryAnalyzer.ini 配置文件可以修改最大的内存,默认1G基本够用了。

    4、在linux执行分析命令

    执行命令

    ./ParseHeapDump.sh m.hprof  org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components。

    m.hprof就是jvm的dump文件,在mat目录下会生成3份.zip结尾的报告和一些m.相关的文件,将生成的m.hprof相关的文件都下载到windows本地磁盘。

    如:

    1407d6133c70cd777edcfdbcb4590c05.png

    5、打开分析报告

    1)使用浏览器

    解压缩以.zip结尾的文件,解压后

    f05ab683c1ddea2f5e66a13f8fca8748.png

    使用浏览器打开index.html文件内容,查看分析报告

    94c61b0533e4b810db4329666f04f2c4.png

    查看Class Histogram一项

    5eb286695c83eec474453a90d73c1f82.png

    发现其中一个类对象占用了7个G,这里的Heap单位都是Byte,自行换算。

    Shallow Heap 既对象本身的大小

    Retained Heap 对象自身加起直接或间接引用的大小

    2)使用eclipse的mat工具

    Eclipse需要按照mat工具,安装步骤可以百度,或者参考

    如果直接打开dump文件还是会内存溢出,所以可以使用eclipse打开分析报告即可。

    使用eclipse-File-Open File打开dump文件,如下:

    c87638babf9a9eda4f8496eca879cc41.png

    会提示错误,点击OK忽略错误,然后选择第三项,重新打开之前的运行报告

    baa355395f30481701ba6ca37e5f139b.png

    点击Next,出现如下界面

    fa94fbe5e5d9827697fc014e34ae11cd.png

    选择其中的一份报告打开,如m_System_Overview.zip

    0501a80f2553b6bf86c423d9aa554a32.png

    得到相同的结果

    8f33047924124b2582835d64320ccf7b.png

    展开全文
  • 1、场景通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出.对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策。...配置jvm参数-XX:+HeapDumpOnOutOfMe...
  • 使用jmap命令得到 jvm内存快照文件

    千次阅读 2018-05-09 17:01:03
    jstat -gcutil 9744 9744是pid jstat -gcutil 9744 500 100 刷新间隔 jmap -dump:formatb,file=danny 9744 生成快照文件 ,可以用 memory analyse 查看
  • jvm内存快照dump文件太大,怎么分析

    千次阅读 2019-02-25 16:18:00
    通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出. 对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策。 这时候怎么办呢?可以使用linux下的mat,既Memory ...
  • mat是eclipse的一个插件,可以分析内存快照帮助我们排查内存泄漏的地方。 首先下载mat, MemoryAnalyzer-1.8.1....写一段出现内存溢出的代码,设置jvm参数 使其出现内存溢出生成一个内存快照文件 package cn.n1.t...
  • -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/app/oom 第一个参数意思是在OOM的时候自动dump内存快照出来 第二个参数是说把内存快照放到哪儿去
  • 解决OOM问题的一个初步思路首先第一个问题,假设发生OOM了,必然说明系统...所以你想知道什么对象太多导致OOM的,就必须得有一份JVM发生OOM时的dump内存快照只要有了那个dump内存快照,你就可以用之前介绍过的MAT之...
  • 导出jvm内存快照进行分析

    千次阅读 2019-08-02 21:48:09
    使用MAT分析内存快照 下载Memory Analyzer Tool独立版本地址 http://www.eclipse.org/mat/downloads.php 现在最新版本Memory Analyzer 1.9.0 Release 下载Stand-alone Eclipse RCP Applications下对应的...
  • IBM的heapanalyzer,可以分析dump出的JVM内存快照。在命令行中,进入到jar文件所在目录,输入命令java -Xmx3000m -jar ha456.jar运行。
  • JVM调优工具Jconsole,jProfile,VisualVMJconsole :jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。详细说明参考这里JProfiler:商业软件,需要付费。功能强大。详细...
  • 如何判断JVM内存泄露

    千次阅读 2016-10-10 19:18:09
    (2)工具一 输出JDK的GC日志数据: 设置:JAVA_OPTS增加以下参数打开jdk的GC输出日志: -verbose:gc -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError(3)jmap获得运行中的JVM内存快照:jmap -dump:format=
  • 本系列笔记主要基于《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》,是这本书的读书笔记。jmap 命令用来生成内存堆...参数说明-XX:+HeapDumpOnOutOfMemoryError内存溢出时自动导出内存快照-XX:HeapDumpPath=...
  • jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等jmap (linux下特有,也是很常用的一个命令...
  • JVM 生成快照

    2019-03-04 12:04:47
    内存溢出快照: -XX: +HeapDumpOnOutOfMemoryError; 生成的快照文件,默认放在项目的目录下面。 需要使用快照的查看工具才方便我们的查看和分析,比如:Eclipse Memory Analysis。 然后就可以查看内存百分比的占比,...
  • # Heap Dump 获取方式使用 JVM 参数获取 dump 文件进入Tomcat的'bin'目录,在'catalina.sh'文件里添加如下内容 >-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:\jakarta-tomcat\webapps 然后使用MAT分析...
  • JVM的启动参数中加入如下的一些参数: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/oom ...第一个参数意思是在OOM的时候自动dump内存快照出来,第二个参数是说把内存快照存放在哪里
  • Jvm内存溢出

    2017-10-03 21:41:57
    遇到内存溢出的问题,可以使用jdk/bin下的javaVisualVM工具分析堆快照,使用之前要先在jvm上加上参数XX:+HeapDumpOnOutofMemoryError,这样就会在程序崩溃的时候,产生一份堆内存快照。 对象是存放在堆中的。而调用...
  • 诊断内存溢出是一个有难度的事情,可以在生产环境试一试下面的参数,在发生内存溢出OutOfMemoryError时做HeapDump并保存到文件,然后分析该文件看是否能查到蛛丝马迹。 set JAVA_OPTS=-Xms100m -Xmx192m -XX:+...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 644
精华内容 257
关键字:

jvm内存快照