|
所有的对象都设置为Null
所有的对象 只要不用了 都设为null 无论jsp或者java
应该就是这个问题吧 你试试看
在tomcat中redeploy时出现outofmemory的错误.
可以有以下几个方面的原因:
1,使用了proxool,因为proxool内部包含了一个老版本的cglib.
2, log4j,最好不用,只用common-logging
3, 老版本的cglib,快点更新到最新版。
4,更新到最新的hibernate3.2
内存泄漏
Jprofiler
jrmc
4. 使用工具Jprofiler,实时监控服务器运行情况,当发现死机时,查看其内存使用情况,类和对象占用的内存大小等…
Jprofiler可以监控内存堆栈的分配和使用情况、对象建立的多少情况、cpu使用的情况,还可以针对每个类或每个对象或每个线程、或每个函数对内存、cpu的使用情况,还可以看java虚拟机中自动垃圾收集的运行情况
最近使用SSH开发一个WEB项目,数据库使用Mysql5.0 ,框架使用SSH。
开发完用户登录模块,经过测试发现一个奇怪的现象,每次测试流程是1.登录-->2.注销,就这样反复测试,可是每次到第九次登录的时候,Tomcat就像死机了一样,程序也死在那里。开始以为是Tomcat内存泄露问题,于是反复修改Tomcat配置。修改完,发现还是老问题,每次到第九次登录的时候Tomcat死掉。后来又以为是Mysql最大连接数设置太小了,或者Mysql设置的缓存太小,于是又修改Mysql的My.ini配置文件,修改完发现还是老问题。于是开始怀疑是Hibernate的Session链接释放问题。
经过仔细检查代码,发现在一个ACTION中,Session session = getSession();后没有
session.close();语句,这时候才恍然大悟,一个小小的疏忽把我整惨了@_@ .
总结:今后在做SSH项目开发时,凡是发现有规律次数后Tomcat突然死机,应该首先考虑是不是Hibernate的Session 对象没有完全释放,否则没有释放的Session堆积太多,必然导致系统崩溃,Tomcat死掉!!!!
关键字: 内存泄露 proxool 数据库连接池
困扰了近两月的内存泄露问题终于初见眉目了,罪魁祸首:proxool
生产环境的系统近两个月一直不稳定,过两天内存就会占满,通过jprofiler,jrmc各中方法调试,总是找不到任何原因。
昨天,在做另外一项测试中,终于发现了一个最可能的存在的内存泄露的地方,proxool数据库连接池内存泄露。
测试环境:
tomcat6.0
mysql5.0
昨天分别到官方网站下载dbcp,proxool,c3po最新版本。全部配置tomcat下成jndi数据源,连接数都配置成最大300,最小30
jrokit R27.5
testInsertDB.jsp直接通过数据源连接数据库,通过一个事务往数据库每次插入200万条数据库。
Java代码
<%
Connection conn = CourseDBService.getConnection();
Statement stmt = conn.createStatement();
String sb=new String("insert into t_sys_log values('id");
conn.setAutoCommit(false);
for(int i=5000000;i<7000000;i++){
StringBuilder sb1=new StringBuilder(sb);
sb1.append(i).append("','userId").append(i).append("','userName").append(i).append("',null,'测试课程").append(i).append("',null)");
//System.out.println("-----------------sb="+sb1);
stmt.executeUpdate(sb1.toString());
}
conn.commit();
stmt.close();
conn.close();
%>
<%
Connection conn = CourseDBService.getConnection();
Statement stmt = conn.createStatement();
String sb=new String("insert into t_sys_log values('id");
conn.setAutoCommit(false);
for(int i=5000000;i<7000000;i++){
StringBuilder sb1=new StringBuilder(sb);
sb1.append(i).append("','userId").append(i).append("','userName").append(i).append("',null,'测试课程").append(i).append("',null)");
//System.out.println("-----------------sb="+sb1);
stmt.executeUpdate(sb1.toString());
}
conn.commit();
stmt.close();
conn.close();
%>
tomcat 6启动后占用168M内存,
开始用proxool从100万-300万插入200万数据,tomcat6 占用内存从168M一直涨到1G,在插入完毕后,通过jrmc手动垃圾回收后,通过jrmc观察,时间堆的占用量还在600M左右,怎么也回收不了。
用dbcp从300万-500万插入200万数据,tomcat6 占用内存从168M稍微涨了一点,但是内存变化不大。
用c3p0从500万-700万插入200万数据,tomcat6 占用内存基本没有什么变化。
具体插入的时间我没有太多统计。粗略感觉,好像时间差不多
今天凌晨,服务器上2个tomcat中一个连接池切换成dbcp,到现在内存回收正常,一直很稳定,通过jrmc看内存占用一直稳定在40%左右,在到60%时会回收到40%,最低能回收到30%。
而另外一个依旧用proxool连接池的tomcat,内存占用率从40%一会就升到100%,然后突然回收到40%,然后一会有迅速的达到100%,然后又回收..........,最低只能回收到40%
在线监控中.......
不知道proxool是不是确实有内存泄露...........
官方网站下载dbcp,proxool,c3po最新版本
解决聚缘问题打算从以下几个方面进行分析:
1、检查代码是否有没有释放的链接 ,所有的对象 只要不用了 都设为null 无论jsp或者java
2、改变数据库释放链接的方法。
3、改变数据库连接池改为C3PO
4、调整tomcat内存参数。
5、查询一下数据库错误。
6、把缓存去掉。
用这个两个工具进行观察。
Jprofiler
jrmc |
|
|