学习使用eclipse MAT查看OOM的问题

229 阅读1分钟

 首先准备测试代码:

@RequestMapping("configdata/function")
@Api(tags = "档案配置-单据功能档案")
public class ConfigDataFunctionController extends BaseJeeeController {

    @Autowired
    private ConfigDataFunctionService configDataFunctionService;

    @RequestMapping("test")
    public ApiJson test() {
        ConfigDataFunction configDataFunction = new ConfigDataFunction();
        List<ConfigDataFunction> list = new ArrayList<>();
        List<ConfigDataFunction> temp = new ArrayList<>();

        for (int i = 0; i < 1000; i++) {
            temp.add(new ConfigDataFunction());
            for (ConfigDataFunction dataFunction : list) {
                temp.add(dataFunction);
            }
            list.addAll(temp);
        }
        return apiJson();
    }
}

准备命令行:jmap -dump:live,format=b,file=heap-dump.bin 1520

1520是 java项目的pid。

启动项目

查看项目pid,pid查看方式:

我是直接通过 jdk 的  bin 目录下  使用 jvisualvm.exe 看到的

  1. 调用  test() 方法。

  2. 执行cmd 上面的命令。

  3. 生成dump文件(bin类型的),默认就在cmd的当前目录下

  4. eclipse 安装 memory analyzer

        4.1) Help -> Eclipse MarketPlace..  -> 搜索 memory,但是我其实没有搜索到,我使用到的是下载下来zip 进行本地安装:

                4.1.1)ftp.jaist.ac.jp/pub/eclipse… 因为我的eclipse版本较低,我用的是1.8.1的。

                4.1.2) 具体怎么安,有很多 可以网上搜索下,我记得1.8.1 add以后 有两个复选框,只需要勾选第一个(第一个下面还有两个子的)就可以。

  1. 安装好以后  选择生成的bin,

每个bin文件 单独放一个文件夹里面,因为会生成一些其他的文件,File -> Open File。

这里可能报错:错误信息:

eclipse An internal error occurred during: "Parsing heap dump from 'C:\Users

这个其实是 eclipse的堆内存不够,到eclipse目录下,找到 eclipse.ini

-Xms2560m
-Xmx10240m

这两个调大就行了

目前知道这些比较重要

 tree 里面能直观的看到 内存占比

leak suspects里面 能看到 details,点击 details能看到定位的问题,比如:

确定了问题所在