Java内存分析
MemoryAnalyzerTool
这是一款功能强大的Java堆转储分析工具。它能够解析和分析Java堆转储文件(例如使用 jmap 或 jconsole 工具生成的 .hprof 文件),识别内存泄漏和内存消耗过高的原因。
简称:mat,是 Eclipse 开发的,翻译就是内存分析工具,看到 Eclipse 就可以知道其 UI 比较旧,是那种白白的UI背景。
软件下载:https://eclipse.dev/mat/downloads.php
mat安装
可以选择不同的版本下载,我下载了好几个,感觉这比较老旧,经验如下:
- Mac版本2021年后就有苹果芯片的版本(Mac OSX (Mac/Cocoa/AArch64))了,挺有意思。
- 如果是本机JDK版本比较老,比如JDK8和11,那推荐用老版本的mat,点击「Previous Releases」找之前的版本,不然安装后会报错。
- 苹果电脑安装了老版本后,设置了JDK路径、本地workspace、启动的内存后,开始分析hprof文件,分析完后还是白屏,很无奈,最后还是选用了Windows版本下载安装。
- Windows版本的2019年版本,或者说mat的都是绿色版本,不需要启动路径和注册表之类的,就是一个zip后解压直接双击exe可用,配置MemoryAnalyzer.ini 就可以用了。
conf配置
- 一般都是 java.lang.OutOfMemoryError: Java heap space error 这种异常后就需要分析内存了。Error异常和Exception异常是两个同层级的异常,所以一些不应该停下的程序应该使用 Throwable 捕获异常。
- Java程序配置运行的配置,堆栈信息(hprof)默认不开启,所以如果要检测内存溢出,需要在 .conf 文件中配置 JAVA_OPTS="+XX:+HeapDumpOnOutOfMemoryError"
一个常见的服务,比如 demo.jar 的配置文件名字是:demo.1.0.0.RELEASE.conf,常见的配置如下:utf8编码,垃圾回收器用G1,打印堆栈内容,用JDK11,堆最小内存(-Xms)和堆最大内存(-Xmx)都是5GB
JAVA_HOME=/usr/jdk-11.0.12
LOG_FOLDER=/dev
LOG_FILENAME=null
JAVA_OPTS="-Dfile.encoding=UTF-8 -Dloader.path=./lib -XX:+UseG1GC +XX:+HeapDumpOnOutOfMemoryError"
export LANG=zh_CN.UTF-8
JAVA_OPTS="$JAVA_OPTS -server -Xmx5g -Xms5g"
mat使用
- 一般都是分析top10的最占据堆内存的大对象,看是否有业务对象出现,一般都不应该出现,出现的话就查一下在业务对象里面是否有循环调用、fastjson处理数组、死循环等情况。
- 分析线程的调用堆栈,看代码是从哪里开始调用的,哪里出现问题,然后针对性地优化代码。
- 内存溢出、内存不够用等Error是致命错误,系统中不应该出现的,必须立马解决。