jvisualvm内存泄漏排查

第一步

双击要查看的线程,选择监视,然后点击堆Dump按钮,就会生成一份内存快照信息。也可以直接导入服务器的dump文件
jvisualvm内存泄漏排查
jvisualvm内存泄漏排查

第二步

选择类那一列,右键点击要查看的类(可排序),点击在实例视图中显示,打开类实例视图
jvisualvm内存泄漏排查

第三步

类实例视图页面可以查看类的属性信息、值和引用信息,最重要的是类的引用信息
jvisualvm内存泄漏排查
在引用视图,右键this选择显示最近的垃圾回收根节点(我一般是直接一层层打开),可以看到Utts类被一个叫utsMap的hashMap引用,而这个utsMap又被Test类引用(即utsMap可能定义在Test类中),且这个utsMap是一个静态常量,是一个强引用(GC不会回收强引用)。

结论: 在Test类中存在一个静态的hashMap,代码中不断向这个map添加Utts类,由于静态常量属于强引用不会被GC回收,最终在不断往map添加Utts对象的结果就是导致内存一直被占用,即内存泄漏。

解决办法(针对集合): 最好不要定义成静态属性,在代码逻辑运行完后把大集合对象设为null
jvisualvm内存泄漏排查
jvisualvm内存泄漏排查

补充

也直接查看集合信息,可以看出集合被哪个类引用,集合里面元素类型,元素个数,然后集合里面的元素类型也有大量类实例的话,那百分之九十就能断定是这个集合导致内存泄漏或者溢出了。
List对应java.lang.object[]
HashMap java.util.HashMap&node
jvisualvm内存泄漏排查