想了解Java内存分析工具MAT?看这里哦

  • MAT 简介

    MAT全称为 Eclipse Memory Analyzer Tool ,eclipse基金会开源的java堆内存分析工具,可以快速的进行堆内存分析、大对象可视化、类加载器分析、线程分析等。在我们碰到线上内存问题时候,是不可多得的好工具(当然也有arthas等国产的好工具 XD)

  • 安装

    建议下载独立安装版

    • 进入mat的下载页面

      https://eclipse.dev/mat/downloads.php
      
    • 下载后解压即可

  • 手把手案例

    • 创建一个项目,新建测试类

      /**
       * =====================================================================================
       *
       * @Created :   2023/9/10 14:42
       * @Compiler :  jdk 17
       * @Author :    VINO
       * @Copyright : VINO
       * @Decription :
       * =====================================================================================
       */
      public class Product {
      
          private String name;
      
          private String brand;
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getBrand() {
              return brand;
          }
      
          public void setBrand(String brand) {
              this.brand = brand;
          }
      }
      
      

      main方法测试类

      
      /**
       * =====================================================================================
       *
       * @Created :   2023/9/10 14:41
       * @Compiler :  jdk 17
       * @Author :    VINO
       * @Copyright : VINO
       * @Decription : 测试启动类
       * =====================================================================================
       */
      public class MockMemExample {
          /**
           * 模拟无限增长的内存
           * @param args
           */
          public static void main(String[] args) {
              List<Product> products=new ArrayList<>();
      
              while(true){
                  Product product= new Product();
                  product.setBrand("a");
                  product.setName("b");
                  products.add(product);
              }
          }
      }
      

      添加jvm参数

      -Xms24m -Xmx24m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:heapdump.hprof  
      

    • jvm参数介绍

      • -Xms24m

        堆内存最小为24M

      • -Xmx24m

        堆内存最大为24M

      • -XX:+HeapDumpOnOutOfMemoryError
        内存溢出时候自动生成堆内存快照文件,其中-XX 表示该参数是非Stable的参数

      • -XX:HeapDumpPath=D:heapdump.hprof
        指定堆内存快照文件生成位置

  • 进行测试

    • 当运行MockExample的测试方法时,报出 Java heap space OOM错误

    • 这表示,列表存储的对象大小超了堆内存设置,众所周知,对象和数组是使用的堆内存。


    去看相应的堆内存快照文件,也生成了。

    • 打开MAT,将快照文件导入到MAT中,File->Open Heap Dump...

      选择 Leak Suspect Report


      注意这里的 Retained size 和 Shallow Size

      • Retained size

        当对象被GC后能够释放的所有内存大小,从图上可以看到 可释放内存为14.4MB

        • Shallow Size对象自身所占用的内存大小

          对象自身所占用的内存大小

    点击Histogram 可以看到每个类的实例数量及占用内存大小

    可以看到Product类的内存占用比最高

    右击 Product这个类,点选 List Objects 可以看到有income和outcome 两个下拉选项

    ListObjects 可以查看对象的引用关系

    其中

    • with outgoing references

      本对象引用了哪些外部对象

    • with incoming references

      查看该对象被哪些外部对象引用了

​ Leak Suspect Report 报表则提供了 最大可能导致内存溢出的原因

可以看到是一个List容器装载的问题

点击 stacktrace可以看到堆栈信息

MAT的使用介绍就到这里了。

SpringBoot Learning系列 是笔者总结整理的一个SpringBoot学习集合。可以说算是一个SpringBoot学习的大集合。欢迎Star关注。谢谢观看。

																				关注公众号不迷路
posted @ 2023-09-12 16:54  CodeStream  阅读(549)  评论(0编辑  收藏  举报