我的系统中tomcat服务每2天都要重启一次,报错OutOfMemory,机器配有4G的物理内存,JVM的内存也设置为1G了。日流量大概每天10万左右。我怀疑程序中有内存泄漏问题,但找了几天都没有进展,怎么办啊,高人们指点一下吧!不胜感激!!!随便问一下:程序中有大量类似下面的代码,是否会内存泄漏?public class User{ //该类中存在大量的static方法
......
private static User[] GetUser(String sql) {
RowSet rs = database.query(sql);  //RowSet是一个自定义的类
ArrayList list = new ArrayList();
if (rs != null) {
User[] users = new User[rs.length()];
for (int i = 0; i < rs.length(); i++) {
try {
users[i] = new User(rs.get(i));
list.add(users[i]);
} catch (Exception e) {
warn("exception when get user ");
}
}
} return (User[]) list.toArray(new User[0]);
}
}JSP程序中调用以上代码,但用完后没有做任何处理,没有显式的去掉引用(即:没有list的remove,没有给数组元素赋值为null)。还有,程序中有很多byte[]类型,是否需要有特殊注意的地方?

解决方案 »

  1.   

    RowSet只是一个自定义的类,里面只包含了一个ArrayList,不是ResultSet.ResultSet在database.query(sql)中已经关闭了。
      

  2.   

    建议用Optimizeit工具检测一下内存使用情况
    也许会有帮助
    分析方法
    内存长期占用并导致系统不稳定一般有两种可能:
    1. 对象被大量创建而且被缓存,在旧的对象释放前又有大量新的对象被创建使得内存长期高位占用。
    &#8226; 表现为:内存不断被消耗、在高位时也很难回归到低位,有大量的对象在不断的创建,经过很长时间后又被回收。例如:在HttpSession中保存了大量的分页查询数据,而HttpSession的会话超时时间设置过长(例如:1天),那么在旧的对象释放前又有大量新的对象在第二天产生。
    &#8226; 解决办法:对共享的对象可以采用池机制进行缓存,避免各自创建;缓存的临时对象应该及时释放;另一种办法是扩大系统的内存容量。
    2. 另一种情况就是内存泄漏问题
    &#8226; 表现为:内存回收低位点不断升高(以每次内存回收的最低点连成一条直线,那么它是一条上升线);内存回收的频率也越来越高,内存占用也越来越高,最终出现"Out of Memory Exception"的系统异常。
    &#8226; 解决办法:定位那些有内存泄漏的类或对象并修改完善这些类以避免内存泄漏。方法是:经过一段时间的测试、监控,如果某个类的对象数目屡创新高,即使在JVM Full GC后仍然数目降不下来,这些对象基本上是属于内存泄漏的对象了
      

  3.   

    这段:
    return (User[]) list.toArray(new User[0]);
    永远返回呢null