我用Java开发的web应用老是出现内存快速增长,最后内存溢出的问题。我用的tomcat5,JDK1.4.2,内存最大设为1498M,有时候也很平稳,但快速增长时,则只增不降,很快就内存溢出了。最近站点登录人数平均一天100人吧,即使几十人也有可能内存溢出。但登录人数多出现这种
我用Java开发的web应用老是出现内存快速增长,最后内存溢出的问题。我用的tomcat5,JDK1.4.2,内存最大设为1498M,有时候也很平稳,但快速增长时,则只增不降,很快就内存溢出了。最近站点登录人数平均一天100人吧,即使几十人也有可能内存溢出。但登录人数多出现这种情况会更频繁。我查阅了很多技术资料,在一些内存开销大的模块都加了System.gc()语句,但都无法解决内存溢出。这次我采用的是四层架构,现将示例代码贴出来,请各位技术高手看看有没有问题。1、WebUser类是映射web_user表字段的值对象类。2、DbWebUserImpl实现了数据库表记录进行进行基本的增删改的类。public class DbWebUserImpl implements DbWebUser{ Connection conn = null; public Connection getConnection() { return conn; } public void setConnection(Connection connection) { nn=connection; } public void updateWebUser(WebUser webUser) throws Exception { String strSql="update web_user set account=?,passwd=?,nickname=? where user_id=?"; PreparedStatement pstm=null; try{ pstm= epareStatement(strSql); int i=1; tString(i++, tAccount()); tString(i++, tPasswd()); tString(i++, tNickname()); tInt(i++, tUser_id().intValue()); pstm.executeUpdate(); }finally{ if(pstm!=null){ ose(); pstm=null; } } }}3、WebUserService是服务层,调用数据访问类的方法,表示层(jsp或action)就直接调用WebUserService类的方法public class WebUserService extends BaseService{ private DbWebUser dbWebUser= tDbWebUser(); public boolean updateWebUser(WebUser webUser){ Connection conn = null; try{ conn= tConnection(); tConnection(conn); dbWebUser.updateWebUser(webUser); return true; }catch(Exception ex){ intStackTrace(); message= tMessage(); return false; }finally{ try{ if(conn!=null) ose(); }catch(Exception ex){ intStackTrace(); } } }}4、表示层(jsp或action)通过调用WebUserService类的updateWebUser方法,来更新web_user表的记录。例如:WebUserService webUserService=new WebUserService();Authorization authorization=(Authorization) tAttribute("authorization"); WebUserForm f=(WebUserForm)form;WebUser webUser= tWebUser( tAccount()); tNickname( tNickname());boolean bret=webUserService.updateWebUser(webUser);//webUser=null;请问各位高手,如果这里不加webUser=null,会不会造成内存泄漏?但我将很多类似的模块都加上了Object=null,仍不能解决内存溢出。这个问题困惑了我很久,一直无法解决。现在论坛提出,请各位老师帮帮忙,非常感谢!为了防止大家进行不必要的回复,现说明如下:1、绝对没有任何地方连接没有关闭。我用三层架构做的另一套系统就好好的,有时候即使内存升至600M也会降下来,但现在我用四层架构做的这套系统,升上去就降不下来了。连接没有关闭这类问题一定做过认真的检查,否则不会到这儿来提问了。2、我用Log4J将用户访问表示层和服务层的信息记录到日志文件中,发现内存猛增的时候用户的操作还是跟平时没什么区别,也看不出问题出在哪儿。如果是某些java代码执行造成死循环,应该用什么方法可以诊断出来。3、曾在服务器上装过jprofile这个软件,但应用一启动,发现装上这个软件内存消耗太大。我在本地用jprofile这个软件也看不出来程序哪儿有问题。
展开
全部