使用JBuilder自带的optimize查找内存泄漏


近期有几个朋友遇到内存泄漏问题,由于不太熟悉Profile类工具的使用而无法准确定位发生此类问题的位置。
JBuilder2005运行时包括三个选项,其中以optimaize方式运行可以分析应用系统的资源利用情况,也可以用于查找内存泄漏的位置。


下面的Test类用于模拟一个内存泄漏过程,每调用一次test方法都会导致1000个字符串无法被GC机制回收。
package test;

import java.util.*
;

public class Test 
{
    static List l = new ArrayList
();
    public String test() 
{
        for (int i = 0; i < 1000; i++
)
        
{
            String s = new String("" + i
);
            l.add(s
);
            s = null
;
        
}
        return "test ok" + l.size
();
    
}

}


因为大部分的Java应用都是B/S环境,这里用test.jsp调用Test.class一并模拟。
<%@ page contentType="text/html; charset=GBK" import="test.*" %>
<html>
<head>
<title>
index
</title>
</head>
<body bgcolor="#ffffff">
<%
  out.print(new Test().test());
%>
</body>
</html>



 1 以optimize方式运行test.jsp。


查看更多精彩图片


2 选择Messages窗口的Memory leak detector,可以看到当前的Heap信息,点击save heap state 按钮可以对当前heap信息做一个记录以便于下一步的比较。


查看更多精彩图片


3 Save heap state 按钮如图。
查看更多精彩图片


4 此时再访问一次test.jsp页面,按程序运行应该增加1000个不能释放的String,运行完毕后Save heap state。


查看更多精彩图片


5 Optimize会自动生成reference变化表(降序)和reference graph,可以看出该表的第一行Count数明显有问题,点击该行。在下方的reference图中会用红色闪烁的标签显示发生变化的位置。


查看更多精彩图片


6 右键 -> open in reference graph


查看更多精彩图片

7 可以在下方的图表中清楚的看到Test.class 第11行存在问题,至此就可以定位发生内存泄漏的位置了。


查看更多精彩图片




 


 

没有评论: