• MAT的简单学习


    背景说明


    • Java遇到问题之后比较浅层的跟踪解决办法:
    jps 查看进程的main jar包 对应的进程信息
    jstack 查看 堆栈信息
    top -Hp PID 实时查看具体的CPU进程信息.
    如果非GC进程占用CPU比较高可以使用
    print %x $SID 打印出 十六进制的 进程信息. 
    jstack -l $PID |grep %x -A 20  查看占用CPU搞高的进程的信息. 
    jmap -heap $PID 查看进程的堆信息.
    jmap -histio $PID 类的直方图
    jmap -dump:format=b,file=xxx.dump $PID  获取dump信息.
    
    • 如果是出现比较难解决的问题 可能无法使用基本的 java 内嵌命令解决问题.
    • 这个时候需要使用 Memory Analyzer Tools MAT 来分析内存.

    下载与使用

    • 最新的下载地址
    https://ftp.jaist.ac.jp/pub/eclipse/mat/1.12.0/rcp/MemoryAnalyzer-1.12.0.20210602-win32.win32.x86_64.zip
    https://ftp.jaist.ac.jp/pub/eclipse/mat/1.12.0/rcp/MemoryAnalyzer-1.12.0.20210602-linux.gtk.x86_64.zip
    
    • 可以在某些目录执行解压缩即可.
    • 注意配置文件
    • 需要说明的是这个版本的MAT需要至少jdk11以上的版本,如果你的JDK不是很高,建议使用低一些的版本
    注意在打开MAT之前可以设置一下内存参数
    参数文件与MemoryAnalyzer.exe 这个文件夹同级, 文件名为:MemoryAnalyzer.ini
    -startup
    plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
    --launcher.library
    plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.700.v20180518-1200
    -vmargs
    -Xmx64G
    -Xms64G
    比如我这边的一个机器是 256G内存的 Win2016, 我这边就设置了 64G的堆区 便于快速分析堆栈信息
    如果运行产品的JVM的堆栈设置的较大, 内存dump会变得更大, 解析起来比较慢一些
    一般情况下20G 左右的dump文件,会耗时半个小时以上才可以进行解析. 
    

    分析dump

    • mat分析dump文件有两种方式
    第一种可以打开本地环境里面的进程信息. 
    Acquire Heap dump 的方式
    第二种打开其他机器转储好的dump文件
    Open Heap dump 的方式
    注意: 一般情况下采用第二种. 生产环境直接上的可能性很小,会导致更多的性能问题.
    
    • 需要注意事项如下, parse过程中会产生大量的索引文件, 可能比整个dump的文件还要大
    • 所以建议解析dump的情况下,磁盘空间务必要充足, 不然会因为磁盘空间不足导致解析失败
    • 另外解析过程中磁盘IO也比较高,建议使用高效的磁盘进行解析.以提高效率.

    Mat Windows

    • 打开dump文件进行长时间的 parse之后 可以使用 windows操作窗格进行简要处理
    • 可以打开dump的明细信息 查看dump的一些主要特点
    • 可以打开dump 的历史记录,查看其他分析的内容.
    • 可以使用设置,修改显示的大小设置,比如设置为MB 大小便于查看(年老眼花专用设置)

    核心功能

    • 重要功能图
      image

    核心功能


    • 说明: 我这边仅是简单应用还未深入.
    核心的是dump文件下面的一排按钮, 还有内存信息下方的报告几个按钮
    一排按钮信息简要如下:
    一个i是overview 概要信息
    三个竖线是部分对象的直方图
    第三个按钮是 支配树,这个功能比较重要: 能够看到 较大对象里面的 核心内容, 便于识别是什么模块的问题. 进行定位.
    第四个按钮 可以进行查询, 我这边暂时没用过. 
    第五个按钮 展示所有的进程的堆栈信息,以及堆栈的保留大小等.
    需要注意的是 内存大小有两个: 
    shallow heap 一般称之为浅堆 可能对象当前属于自己的大小
    retained heap 一般称之为深堆, 一个算法是 这个对象内gc回收时 能够回收涉及级联所有对象的大小.
    我这边图里面深堆最大的对象就是一个 memory leak的点. 
    
    注意 第五个按钮其实是report
    注意与下面的的report是一致的
    比较重要的是 leak suspect 内存泄漏检测
    这个功能可能比较费时,但是查询出来可能比较完备. 
    
    一般一个进程dump 一个 memory leak 就足够撑爆了.
    
    注意 第六个 按钮就是query tool 能够查看各种对象.
    这个需要很深入的功底了, 我这边暂时也没有用到(正在入门)
    
  • 相关阅读:
    Unity项目
    Unity基本操作
    博客园自定义主题样式
    明解C语言
    C指针基础知识
    排序算法
    session理解与总结【session原理、应用、与cookie区别】
    cookie理解与实践【实现简单登录以及自动登录功能】
    【数据结构与算法】双指针思想——数组首部或尾部同向遍历
    【数据结构与算法】双指针思想——首尾双向遍历
  • 原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/16041539.html
Copyright © 2020-2023  润新知