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.WebStart

2.使用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?