首先准备测试代码:
@Controller
@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)http://ftp.jaist.ac.jp/pub/eclipse/mat/ 因为我的eclipse版本较低,我用的是1.8.1的。
4.1.2) 具体怎么安,有很多 可以网上搜索下,我记得1.8.1 add以后 有两个复选框,只需要勾选第一个(第一个下面还有两个子的)就可以。
5. 安装好以后 选择生成的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能看到定位的问题,比如:
确定了问题所在