吴密的博客

每天进步一点点
posts - 12, comments - 1, trackbacks - 0, articles - 1

系统内存泄露(防丢)

Posted on 2011-01-06 18:38 xiaolang 阅读(2551) 评论(0)  编辑  收藏

  1. Jboss数据源配置文件中, <prepared-statement-cache-size>配置项的值设置过大(最初设为100),是导致内存使用过大的直接原因。众所周知,对sql语句进行预编译,可以提高sql语句的查询效率,因此使用该配置项设定最多缓存多少条预编译的sql语句(tradequery应用系统设定的值为100个)。物理分库后,一台服务器从20个数据库连接增加到60个数据库连接,每个连接都会缓存100条预编译的sql, 总共就是60*100 = 6000个。然而实际上jdbc在解析sql语句的时候,进行缓存的并不只是sql语句本身,还缓存了查询结果字段类型的大小。并且如果语句中包含in的查询,由于in后面的列表是变化的,因此就可能会对一条查询语句进行多次不同的缓存。此外,jdbc driver里还会预先设定一个值(fetch Size),用来表示缓存sql的查询结果条数,这也会再次成倍数的增加内存的消耗。因此,<prepared-statement-cache-size>值设置太大,将可能会耗光应用服务器的内存。

 

2. 使用了未设计细致的velocity引擎, new了大量的空对象。因为销售老的流程引擎中直接使用了velocity引擎,而引擎中使用了老的log4j文件,由于框架中也未设置velocity的日志配置,输出日志时,没有找到appender,所以都是新new出来的。因此一旦业务发展,每次流程执行中都会新建大量的appender对象。业务量到一定程度的时候,会导致系统内存爆满。

只有注册用户登录后才能发表评论。


网站导航: