zoukankan      html  css  js  c++  java
  • 使用MAT来进行java内存问题的简单分析

      使用IBM的MAT工具,java内存泄露,内存溢出等问题可以简单的分析出原因。关注点是占内存最多的几个对象,对象实例数最多的几个对象。

      原文地址:https://www.cnblogs.com/ken-jl/p/9029057.html

      当线上环境出现OOM/内存泄漏了,怎么办?

      让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,配置-XX:+HeapDumpOnOutOfMemoryError,

      当出现OOM时,分析dump下来的hprof文件,一般使用MAT辅助查看。

      安装方式:

      1 eclipse安装MAT插件;安装说明:https://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html

      2 独立版本(建议),下载地址:http://www.eclipse.org/mat/downloads.php,下载解压后就可以直接用。

      分析一个堆转储文件需要消耗堆空间,需要分配内存,

      MemoryAnalyzer.ini中的参数一般默认为-vmargs– Xmx1024m;

      当dump文件的大小大于配置的1024m,会报错;

      方式1:修改启动参数 MemoryAnalyzer.exe-vmargs -Xmx4g

      方式2:编辑文件 MemoryAnalyzer.ini,修改/添加参数 -vmargs– Xmx4g

       模拟产生hprof文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class OOMTest {
        public static void main(String[] args) {
            List<Person> list1 = new ArrayList<>();
            for (Long i = 0L; i < 1000L; i++) {
                list1.add(new Person(i, i.toString(), i.toString()));
            }
     
            List<Shop> list2 = new ArrayList<>();
            for (long i = 0L; i < 256L * 1024L * 1024L; i++) {
                list2.add(new Shop(i));
            }
        }
     
        static class Person {
            private Long id;
            private String name;
            private String idcard;
     
            public Person(Long id, String name, String idcard) {
                this.id = id;
                this.name = name;
                this.idcard = idcard;
            }
        }
    }

      

       修改相关参数,这里加上了 -XX:+HeapDumpOnOutOfMemoryError -Xmx256M

     

      执行后:

      dump下来的hrof文件在项目工程目录下(或指定导出目录:-XX:HeapDumpPath)。

      打开MAT工具,File >> Open Heap Dump...

      通过分析结果,很容易知道哪些对象占用了大量的堆内存。

       MAT会把分析结果打包成zip包,解压后通过浏览器就可以访问。

      打开对象依赖关系树形视图

      相关链接:

      http://seanhe.iteye.com/blog/898277

      http://www.blogjava.net/rosen/archive/2010/06/13/323522.html

      https://blog.csdn.net/rachel_luo/article/details/8992461

  • 相关阅读:
    Android中的Keyevent
    Android的RecyclerView
    Android中的Context
    Android中数据的传递以及对象序列化
    Android中的多线程编程
    Android中的dp, px, pt
    Android中的内容提供器
    Android中的数据保存
    Android中ListView的用法
    Android中Activity的启动模式
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/13946102.html
Copyright © 2011-2022 走看看