其实这个话题最好的参考资料是JProfiler自带的帮助文档,通过help->help content,然后以"leak"为关键字搜索,"Finding a Memory Leak"中详细的描述了探测内存泄露的检测方法。大致的过程如下:
1)查找怀疑对象
在"memory views"视图中,选中工具栏的"mark current value and show difference"按钮,或者使用"view->mark current value"菜单选择,当程序运行时,如果某个类的实例有变化,那么会以增量的形式显示。如果我们点击工具栏的"Run GC",那么增量会下降,如果某个类的增量异常,那么这个类就是内存泄露的怀疑对象,需要进一步观察。
2)根据GC Root判断真正的原因
如果第一步找到了怀疑对象,那么我们在怀疑的Class上“右键->show selection in heap walker”,在“heap walker”视图中,下方有"Classes","Allocations","Biggest Objects","References","Time","inspections","Graph",这些子视图,常用的是References视图,在这个视图中,我们可以查看某个实例的"incoming references"和"outgoing references"。"incoming references"用于判断和哪个GC roots相连,"outgoing references"用于定位代码的大概位置。如图:
Comments are closed.