解决tomcat并发问题

本文讨论了在使用Tomcat时遇到的并发和内存泄露问题,特别是由于未关闭Session导致的问题。提到了可能的原因,如Proxool数据库连接池的内存泄露,并对比了dbcp和c3p0连接池的性能。解决方案包括检查并释放未使用的对象,更改数据库连接池,调整Tomcat内存参数等,并推荐使用JProfiler和jrmc进行监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所有的对象都设置为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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值