技术开发 频道

Java内存泄漏分析

    再运行一段时间后,按Size diff排序。发现占用内存比较多的了后,双击该行,打开该对象的详细信息(目前bug已经改好,我只是随便点一个类作为示范)。这时展开整棵树,就可以看到该类所有实例分别是在什么方法中生成的(如果跟踪CPU信息,也有这种资源分配树显示)。

    

    图11 某个类的所有对象的构造位置分布

    因为占用内存最多的往往是系统基本数据类型,例如char,int[]等等,所以需要人工去判断哪些类是真正的疑点。我发现占用新申请内存排名第20-30之间有几个类的对象数是完全相同的,而且持续同步增长,估计是某些线程中重复构造对象造成的,比其他以不规则速度增长的类更加可疑,于是就仔细检查了这几个的类的详细信息,发现果然是来自同一个函数。再仔细看代码,就找到内存泄漏的原因,原来是某行代码写错了,不断构造新的button。而保存这些button是用Vector!说明我最早使用的检查HashMap的思路是对的。可惜只是从自己的编程习惯出发,没有考虑到Vector,否则问题就更容易发现了。

    不过当时还曾经检测到一个突变过程,至今没有想明白原因。在没有任何人对该计算机进行操作的情况下,CPU和内存占有率在某个时刻同时暴增。如图:

    

    图12 CPU占用率突变

    

    图13 内存占用突变

0
相关文章