由于对象内存大小涉及到GC回收的时延,对象越大,回收时间越长,尤其是有引用的时候,在GC年龄段内会在年轻代返回的拷贝,非常耗时,因此清楚项目中哪些对象占用的内存很大是很有必要的。闲话少说,直接上方法。
一、通过jps命令查看java 进程为812251;
二、生成堆内存活着的对象使用情况:一般情况下生成的文件会很大,我们项目alarm生成的文件2.2G。
jmap -dump:live,format=b,file=pid.hprof 812251
三、将生成的文件pid.hprof下载到本地(windows)进行分析
四、下载分析工具MemoryAnalyzer,下载地址:https://www.eclipse.org/mat/downloads.php
下载完成后,双击MemoryAnalyzer.exe,点击Open a Heap Dump
注意:MemoryAnalyzer的MemoryAnalyzer.ini会配置占用空间的最大内存,默认是1024M,而我们生成的堆文件一般都是超过2G的,所以肯定不够用,所以需要将内存改的大一点,我是改成了8G。
导入后惊喜来了:发现HostsServiceImpl类的对象,占用了1G内存!mygod!剩下的问题就是如何去优化HostsServiceImpl的对象生成了。