jvisualvm内存泄漏排查
第一步
双击要查看的线程,选择监视,然后点击堆Dump按钮,就会生成一份内存快照信息。也可以直接导入服务器的dump文件
第二步
选择类那一列,右键点击要查看的类(可排序),点击在实例视图中显示,打开类实例视图
第三步
类实例视图页面可以查看类的属性信息、值和引用信息,最重要的是类的引用信息、
在引用视图,右键this选择显示最近的垃圾回收根节点(我一般是直接一层层打开),可以看到Utts类被一个叫utsMap的hashMap引用,而这个utsMap又被Test类引用(即utsMap可能定义在Test类中),且这个utsMap是一个静态常量,是一个强引用(GC不会回收强引用)。
结论: 在Test类中存在一个静态的hashMap,代码中不断向这个map添加Utts类,由于静态常量属于强引用不会被GC回收,最终在不断往map添加Utts对象的结果就是导致内存一直被占用,即内存泄漏。
解决办法(针对集合): 最好不要定义成静态属性,在代码逻辑运行完后把大集合对象设为null
补充
也直接查看集合信息,可以看出集合被哪个类引用,集合里面元素类型,元素个数,然后集合里面的元素类型也有大量类实例的话,那百分之九十就能断定是这个集合导致内存泄漏或者溢出了。
List对应java.lang.object[]
HashMap java.util.HashMap&node