以下代码没有特殊说明,都是指终端命令行操作
1、查看内存占用高的进程
top
2、查看对象个数和占用内存大小
jmap -histo 624
可以看到程序中各个对象所占用内存的情况,根据占用字节数大小降序显示,这里只能看出哪些对象占用内存高,但是还不能具体定位到问题代码,需要进一步排查。
有个自定义的类Animal,个数和占用内存比较高,是重点怀疑对象。
图中一些特殊字符的含义如下:
符号 | 含义 |
---|---|
[C | 表示char[],一般与String对象相关,因为String其实就是基于char数组实现的 |
[S | 表示short[] |
[I | 表示int[] |
[B | 表示byte[] |
[Z | 表示boolean[] |
[J | 表示long[] |
[F | 表示float[] |
[D | 表示double[] |
[II | 表示int[][] |
[Ljava.lang.Object | java.lang.Object类型的数组 |
[Ljava.lang.String | java.lang.String类型的数组 |
3、导出内存镜像
jmap -dump:format=b,file=testDump.hprof 624
4、安装独立版本的Memory Analyzer工具
下载链接:
http://www.eclipse.org/mat/downloads.php
5、使用MAT工具进行分析
-
打开dump文件
-
查看对象个数和占用内存数
-
查看每个线程的内存使用情况
6、注意
当dump文件过大时,Memory Analyzer工具会提示解析出错
An internal error occurred during: "Parsing heap dump from '/Users/mac/cece/testDump.hprof'".
Java heap space
需要找到配置文件MemoryAnalyzer.ini,修改-Xmx的配置大小,如:
-startup
../Eclipse/plugins/org.eclipse.equinox.launcher_1.6.200.v20210416-2027.jar
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.2.200.v20210527-0259
-vmargs
-Xmx4g
-Dorg.eclipse.swt.internal.carbon.smallFonts
-XstartOnFirstThread
-Xmx配置的默认大小为1024m