我的系统中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[]类型,是否需要有特殊注意的地方?
......
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[]类型,是否需要有特殊注意的地方?
解决方案 »
- 求web高手解答。。
- XML格式字符串的解析
- 一个小小的问题
- 虚心求教:关于Java中用Jxl读取Excel公式有误的问题
- 高分求设置当前IE窗口是否显示工具条和菜单栏的javascript
- 注册后;如何通过注册时的邮箱来激活账号-jsp实现
- [Microsoft][SQLServer 2000 Driver for JDBC]Unsupported method: ResultSet.last急急!!在线等
- ext1.0
- 请教jsp服务器配置,急!很久没有弄出来了,多加分!
- 现在好多大网站的新闻发布系统用的是哪种技术?
- 关于ODBC桥接的数据库连接问题,请多帮忙谢谢
- 用户注册时头像预览的问题
也许会有帮助
分析方法
内存长期占用并导致系统不稳定一般有两种可能:
1. 对象被大量创建而且被缓存,在旧的对象释放前又有大量新的对象被创建使得内存长期高位占用。
• 表现为:内存不断被消耗、在高位时也很难回归到低位,有大量的对象在不断的创建,经过很长时间后又被回收。例如:在HttpSession中保存了大量的分页查询数据,而HttpSession的会话超时时间设置过长(例如:1天),那么在旧的对象释放前又有大量新的对象在第二天产生。
• 解决办法:对共享的对象可以采用池机制进行缓存,避免各自创建;缓存的临时对象应该及时释放;另一种办法是扩大系统的内存容量。
2. 另一种情况就是内存泄漏问题
• 表现为:内存回收低位点不断升高(以每次内存回收的最低点连成一条直线,那么它是一条上升线);内存回收的频率也越来越高,内存占用也越来越高,最终出现"Out of Memory Exception"的系统异常。
• 解决办法:定位那些有内存泄漏的类或对象并修改完善这些类以避免内存泄漏。方法是:经过一段时间的测试、监控,如果某个类的对象数目屡创新高,即使在JVM Full GC后仍然数目降不下来,这些对象基本上是属于内存泄漏的对象了
return (User[]) list.toArray(new User[0]);
永远返回呢null