2.6堆内存诊断-jvisualvm
在这一节中,我们将介绍实际开发中,内存问题的排查步骤,我们将从真实的案例下手,案例如下;
案例:垃圾回收后,内存占用仍然很高
步骤
这里,我们暂时先不看案例代码(案例代码位于文章底部),先尝试通过工具进行内存分析
案例代码Demo2已经运行,接下去我们通过如下步骤排查问题
1.使用jps查看进程id
2.使用jmap -heap {进程id}查看内存使用情况
3.使用jconsole动态查看内存使用情况
4.使用jvisualvm动态查看内存使用情况
演示
1.使用jps查看到Demo2的进程id为12968
$ jps
5396 Launcher
12968 Demo2
16216 RemoteMavenServer
23960 sun.plugin2.main.WebStart2.使用jmap -heap 12968查看堆内存使用情况。发现伊甸园占用48.5M,老年代占用202M
3.使用jconsole命令打开jconsole
选择Demo2连接

连接过程中可能出现如下警告,无需关注,使用 不安全的连接 即可

观察内存占用约为230M,之后我们点击了执行GC后,内存占用下降,但仍占用约217M,这是什么原因造成的呢? 
通过jmap命令再次查看内存占用信息,发现垃圾回收后,老年代仍占用202M
究竟是何种原因造成老年代内存占用居高不下呢。我们可以使用jvisualvm进一步分析
打开jvisualvm
选择Demo2连接
使用堆Jump抓取快照 
查找占用了大量内存的对象

发现一个ArrayList对象占用了近209M的内存,看来这就是我们的罪魁祸首了

查看ArrayList的冤死发现ArrayList中存储着200内大小为1M左右的Student对象(图中仅展示了前6个)

分析到此结束,而事实其实也是如此。
代码如下:
最后希望,大家都能够熟练掌握排查内存占用问题的方法,谢谢大家。
Last updated
Was this helpful?