在 http://bbs.landingbj.com/t-0-252661-1.html 这篇帖子中对heapDump有了基本的认识,下面介绍heapDump更多的内容。
用IBMHeapAnalyzer打开生成的heapDump文件,主要观察tree view视图和object view视图。
heapDump与 http://bbs.landingbj.com/t-0-252661-1.html 中的heapDump文件一样。下面是tree view视图的内容
每一行的格式为:
对象的总大小,包括本身和子对象的大小的和,子对象指被引用的对象。
对象总大小所占堆内存的百分比
对象本身的大小
子对象的个数
对象名称
对象所在地址
从图中可以看到
ArrayList对象占用了大量的堆内存,其子对象为object数组。如果看过Java实现List的源码的话,很容易理解list就是通过数组来实现。这个巨大的数组对象有1329817个子对象。问题基本清晰了,就是ArrayList中放了太多String对象,把堆内存撑爆了。点击Leak Suspect,会提供可能发生内存泄露的地方。
再看object view
totalsize:对象总大小,包括子对象大小。
size:对象本身大小
child:子对象数量
parent:直译过来是父对象的数量,点击右键可以列出父对象,具体含义还不太清楚,大概是引用此对象的对象数吧。
name:对象名称
如果totalsize、size、child的数量都很大,怀疑此对象导致OOM可以右键进入此对象在tree view中的位置。
有了heapDump再结合weblogic日志与相关代码,更容易找到导致OOM的bug了