令人郁闷的Memory Leak!请进来讨论

04-09-24 rytaiou
我现在有一个这样的应用:
一个新闻网站(稿件数目前约为4万,是Jsp页面),网站的服务器使用了Tomcat4.1.30,JDK使用1.4.2-b05

先前部署在Linux EAS 3.0下,不到一个小时Tomcat就会挂掉,看错误日志是OutOfMemory,把JVM的内存加到512M(-Xmx512m)也不管用,
增加
LD_ASSUME_KERNEL=2.2.5(或2.4.19)
export LD_ASSUME_KERNEL
也不行,Java进程使用内存大概到170M左右肯定就死掉了

因此怀疑是Tomcat在Linux下有问题,于是就把系统放到放到了Window Server family下,倒是可以支持很长时间,但是很是会撑死,这时候Java进程大概使用了250M左右的内存

应用的特殊性:Web容器放是的Jsp页面,更新比较频繁,而且量也比较大,整个网站的访问量大概在3万/天

现在怀疑是不是Tomcat在编译Jsp或处理并发请求上有问题,请各位多多指教,谢谢!

banq
2004-09-24 10:49
一般出现这样的情况,首先怀疑的是自己的程序设计和代码,而不是Tomcat等开源容器。


使用Borland的Optimzeit监察memory porfile,可以查询中具体哪个类耗费内存最多,可参见:

http://www.jdon.com/product/performance.htm

pottery
2004-09-24 11:03
java代码写的不好,肯定会造成内存的泄漏,可惜啊,我只能看你的代码才能确定你的问题

rytaiou
2004-09-24 11:08
banq老大:

程序问题是最先被怀疑的,我做过测试:
稿件JSP中不做任何业务逻辑,就把这些Jsp当作Html来对待,
结果还是老是撑死...才会怀疑是Tomcat的问题的

谢谢

SportsBaby1980
2004-09-24 13:15
推荐使用JBoss 整合Tomcat

rytaiou
2004-09-24 13:29
楼上的兄弟:

这跟JBoss有什么关系呢?

cxj_2000
2004-09-24 23:01
不需要使用ejb就不要使用jboss。

SportsBaby1980
2004-09-27 10:04
我对单独的Tomcat Server,不太放心
毕竟只是一个Web服务器

很多动作,不仅仅是在Web上做的,
所以,我一直不单独使用Tomcat,而是使用JBoss+tomcat



rytaiou
2004-09-28 08:44
敬请关注这个问题...
各位没有这样的应用么?

SportsBaby1980
2004-09-28 10:07
又看了一下 你的问题


感觉程序的问题的可能性比较大。
为什么一到170M左右就死?

我想,如果单是java的内存的问题的话不会在170M/250M死掉,
直到达到java内存上限

也就是说,可能是数据库(如果使用了)
或者并发问题。
更新频繁?是什么更新频繁? 页面?还是数据?
还是其他的?
如果是更新频繁,那么说明Tomcat cache满足不了要求。
如果是数据,那么就是取数据的程序的问题了。

这个问题你要向banq请教吧。
jdon这么快



rytaiou
2004-09-28 10:13
谢谢SportsBaby1980 兄的关注!!

我说的页面频繁更新,因为这是个新闻网站,
每天都有大量新闻页面发布出来,每个新闻页面是一个JSP,
其中JSP中两处包含了业务逻辑:
include了一个Check.jsp进行用户校验
放了一个href去连一个Servlet来进行点击量统计,

现在的问题是:我把Check.jsp换成了空页面,Servlet中也不坐任何业务逻辑,
若稿件页面不停更新,Tomcat会挂掉,
若没有新的稿件页面,则Tomcat正常.....

SportsBaby1980
2004-09-28 10:41
呵呵

是这个样子啊?

那么多JSP,
要知道JSP从发布到,运行起来,中间有很多过程:
首先要编译
这一个最麻烦的了,因为编译很慢。
你稿件是40K左右个,
那么,一天要新增几个?

为什么不换一下实现的形式呢?
把新闻放到数据库中,这不更好吗?

rytaiou
2004-09-28 11:00
每天新增的稿件可能有300左右吧,
因为系统是一个CMS,从稿件的采集、编辑、管理到发布,是一个比较庞大的系统,因此改变已有的实现方式是不大现实的,
Jsp本身是根据数据库中的内容生成的,

生成的Jsp独立的组成了新闻Web站点,与我们的CMS系统再无联系了。

现在想这样来做,不知是否可行:
放一个Servlet,这个Servlet接收参数,该参数表明想看的Jsp页面的路径,然后Servlet根据该路径取得Jsp文件的内容,在把内容写倒Response的Out中去,

这样做的假设是:Tomcat在编译Jsp时会有MemoryLeak,而使用这样的方式来绕过Jsp的编译。

请各位指教!