通过jvisualvm分析内存泄漏

到jdk的目录下的bin下执行jvisualvm
通过jvisualvm分析内存泄漏

进去之后,如图

通过jvisualvm分析内存泄漏

上面是有visual GC这个工具的,但是真实的我刚打开的时候是没有的,需要:

通过jvisualvm分析内存泄漏

找到希望安装的插件进行安装,因为visual GC这个插件我已经安装过了所以在已安装里面

通过jvisualvm分析内存泄漏

这里我们再安装下VisualVM-JConsole这个插件

然后关掉原来的窗口,再次启动

通过jvisualvm分析内存泄漏

因为看效果比较慢,所以 java -Xmx201k -Xmn200k -jar nanjing_jvm_demo-1.0-SNAPSHOT.jar
这里将虚拟机可用内存设小一点,然后年轻代设置大一点,年老代自然就小了。

通过jvisualvm分析内存泄漏

通过下图发现,年老代,发生了6次,但是年老代还是持续增长的,说明存在无法被回收的对象,可能是内存泄漏了。

这个时候看抽样器

通过jvisualvm分析内存泄漏

NanJing28Suo果然是最大的,正如我们的Demo中的
点击dump堆

通过jvisualvm分析内存泄漏

过一段时间再dump一次(当然了我demo中就是最大10000,这样不同的时间间隔是没有变化的,在缓慢增长的时候dump两次能够看出变化)

通过jvisualvm分析内存泄漏

这个时候左边出现了两个dump文件,点击任意的一个dump文件,与另一个比较

通过jvisualvm分析内存泄漏

刚才说了,因为我的demo实例已经到达上限,所以下图是没有变化的,真实场景是能看到类的缓慢增长的,时间有限,这里就不演示了

通过jvisualvm分析内存泄漏

下面是网上的有增长的图

通过jvisualvm分析内存泄漏

而我们上面知道最消耗内存的是NanJing28Suo这个类,所以

通过jvisualvm分析内存泄漏

通过jvisualvm分析内存泄漏

通过jvisualvm分析内存泄漏

可以看到左边是实例,右边是他的引用,谁持有引用?最后终于定位到了ArraList

https://www.cnblogs.com/shangxiaofei/articles/10867908.html

https://www.cnblogs.com/liululee/p/11056779.html