起步软件技术论坛-X3

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: zhouxihong

[错误]Java heap space,如何解决?**

[复制链接]
发表于 2006-12-13 11:49:31 | 显示全部楼层
以下内容转贴自
http://www.cydxc.tianyaclub.com/ ... 666817&
=======================
再论Tomcat的数据库连接池溢出问题作者:libaike 提交日期:2006-11-27 11:12:00 | 访问量:55
以前谈过一次关于Tomcat的数据库连接池溢出的问题,错误页面的提示说Cannot get a connection, pool exhausted 。我说过把连接池的最大连接数调大一些,但是这好像并没有解决问题。因为虽然出现连接池溢出的时间的间隔拉长了,但差不多一个星期还是会出现此问题。

今天再次来讨论这个问题,通过搜索网页,找到了这么个办法。就是通过在Tomcat的配置文件中配置数据源时增加一些参数。用这些参数来控制数据池中的连接的生命周期,当连接超过多长时间时自动失效,这样无效连接就不会越积越多。以前也想过tomcat应该具有这样的功能,但一直没有去找。

下面是具体的参数设置:
<Context path=”/friends” docBase=”D:/friends” debug=”5″ reloadable=”true” crossContext=”true”>


<Resource name=”jdbc/friends” auth=”Container” type=”javax.sql.DataSource”
  removeAbandoned=”true” removeAbandonedTimeout=”60″ logAbandoned=”true”
                  maxActive=”100″ maxIdle=”30″ maxWait=”10000″ username=”root” password=”123456″ driverClassName=”com.mysql.jdbc.Driver”
                url=”jdbc:mysql://localhost:3306/friends?characterEncoding=utf-8&amp;useUnicode=true&amp;autoReconnect=true”/>

</Context>
回复 支持 反对

使用道具 举报

发表于 2006-12-13 11:49:59 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2006-12-13 11:53:46 | 显示全部楼层
以下内容转贴自
http://www.matrix.org.cn/resource/article/43/43722_Tomcat.html
=======================
Tomcat连接池中,部分参数说明如下:

  maxActive="100"  <!--最大活跃连接数,这里取值为100,表示同时最多有100个数据库连接。设为0表示无限制。-->

  maxIdle="30"       <!--最大的空闲连接数,这里取值为30,表示即使没有数据库连接时依然可以保持30个空闲的连接,而不被清除,随时处于待命状态。设为0表示无限制。-->

  maxWait="10000"    <!--最大建立连接等待时间。如果超过此时间将接到异常。这里设置为10000,表示10秒后超时。设为-1表示无限制,直到超时为止。-->

    jdbc:mysql://localhost/jcc    <!--数据库连接字符串,同jdbc:mysql://localhost:3306/jcc?autoReconnect=true-->

    PS:如果最大数据库活跃连接数过大,可想而知,内存占用量是非常惊人的!如果空闲连接数过大,则资源利用率低,连接池长期未释放,可导致连接池结点异常。所以选好maxActive和maxIdle是连接池性能的关键因素,当然这取决于服务器环境。

  *附:

  连接池运作原理:

  在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。

  数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。

  数据库连接池的主要操作如下:

  (1)建立数据库连接池对象(服务器启动)。

  (2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。

  (3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。

  (4)存取数据库。

  (5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。

  (6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-14 11:33:32 | 显示全部楼层
谢谢alang,正在尝试。。
回复 支持 反对

使用道具 举报

发表于 2007-2-26 14:10:58 | 显示全部楼层
不知道楼主是否解决了
以下内容转贴自
http://huangjien.iblog.com/post/543/118704
======================
Java调优必杀技

在没有代码或者代码方面手段已经用尽时,java系统调优主要还是调内存。

通常,都会把Xmx Xms设成一样,并尽量用较大的数字,所有的文章都说越大越好,可是有时会有稳定性问题。

另外,现在很多系统开发时,都会碰上乱在session里放数据的问题,session对象的生命长度通常是中等偏上,很容易他们就进入了old区,一多了就只有full GC了。还有,纵观现在的流行框架,多半用hibernate,仔细研究这些对象的生命长度,也多是中等偏上。

这样,调优的一个原则就是别让这些东西进入old区,以减少full GC的次数。我的办法是设置参数-XX:NewRatio=1。这样,极大地扩大了young区,young GC少了,对象进入old区的也少了,很多中等寿命的对象还没来得及进入old区就被回收了,这样,full GC的次数也会少。

这是一个来自实践中的经验,每次这样设置,都能大大提高系统的稳定性,当然CPU的使用率会提高。

另外一个作用是掩盖应用中的内存泄漏:在一个真实的系统压力测试时,我们都知道了它有内存泄漏,在压力测试8小时后会崩溃,内存曲线的线性下降标示出了这一点;改了这个参数后,内存曲线基本看不出下降了,经过了24小时压力测试,系统依然有很正常的输出。要知道,系统在这24小时压力测试下完成的交易差不多等于系统上线后1年完成的交易数,所以我们基本上认可了系统可以正常使用。但是,对于这件事,还没有一个完整合理的解释。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-25 09:24 , Processed in 0.036333 second(s), 13 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表