使用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信息做一个记录以便于下一步的比较。
4 此时再访问一次test.jsp页面,按程序运行应该增加1000个不能释放的String,运行完毕后Save heap state。
5 Optimize会自动生成reference变化表(降序)和reference graph,可以看出该表的第一行Count数明显有问题,点击该行。在下方的reference图中会用红色闪烁的标签显示发生变化的位置。
6 右键 -> open in reference graph
7 可以在下方的图表中清楚的看到Test.class 第11行存在问题,至此就可以定位发生内存泄漏的位置了。
没有评论:
发表评论