导出java进程的堆内存信息
使用下面命令导出java进程的堆内存,其中pid为java进程id,文件可能会很大,视进程分配多少内存。
jmap -dump:live,format=b,file=heap.bin pid
打开MAT工具导入heap.bin文件
这步主要说一点,如果heap.bin很大MAT可能不够内存加载文件,可以修改配置文件加大MAT内存,我的是1.9.0版本,修改配置文件MemoryAnalyzer.ini
,将默认的配置-Xmx1024m
的数字再改大一点。
开始分析溢出内存的代码
- 打开下面选项左上第一个选项 Actions -> Histogram,会按占用内存大小排序列出所有对象
- 选择内存最大的对象右键选 Merge Shortest Paths to GC Roots -> with all references,会按占用内存大小排序列出所有引用的线程
- 选择内存最大的线程右键选 Java Basics -> Thread Overview and Stacks,会列表线程的堆栈信息
- 从堆栈信息找出认识的对象和方法,定位到代码里排查,就像平时看异常日志信息一样。
- 如果没找到,重复第2到第4步,从第2、第3步占内存多的类和线程找。