[高分求解]关于内存泄漏(Tomcat5.5+jdk1.5)

pds9902 2005-11-07 05:35:58
问题描述

服务器在运行一段时间后(两三天),内存不断上升(可到900M),经常出现java.lang.OutOfMemoryError: PermGen space的错误,导致tomcat死机,外部不能找开网站.

目前,web服务和数据库服务是分开的,web服务器是2005年9月才升级的,
内存2G,内存泄漏基本可以确定为Web服务器软件环境引起的.
Web服务器的软件环境如下:
操作系统:Win2000 server
Web服务:tomcat5.5
Jdk版本:jdk1.5

网站开发先后经历了三次大的调整,开发环境从最初的jdk1.4,tomcat4.0
升级到了现在的jdk1.5,tomcat5.5, 技术上也由当初的javabean+jsp,增加了struts,sql mapping,jstl,displaytag,另外,后台还同时运行了多个进程,以实现邮件的订阅,测评刷新,职位刷新,RSS刷新等功能

解决方案

鉴于以上情况,我通过以下步骤来排除内存泄漏的问题:

1. 根据近段时间的日志文件,发现有些情况下,死机前后,都是有后台线程启动,如”职位刷新””RSS刷新”,所以我准备先停止后台线程的自动运行,改成手动启动,以测试是否因为后台线程自动运行引起的干扰.

2. 错误java.lang.OutOfMemoryError: PermGen space,倒底是不是因为对象内存占用过多,没有被虚拟机JVM回收的原因引起,这点我一直有疑问.

查了一下PermGen space,全称是Permanent Generation space,就是说是永久保存的区域,用于存放
Class和Meta信息,Class在被Load的时候被放入该区域,从字面看,和存放Instance的Heap区域不同,GC(Garbage Collection)应该不会对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误.

所以我怀疑是我们源代码是使用了太多的静态static对象/方法/属性 所引起的,因为静态的对象/方法/属性是和类关联的,不被虚拟机JVM回收.正像上面说的, 如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误.,会不会太多的静态的对象/方法/属性会引起这个错误呢?

这点是我自己的理解,如果要验证,需要改写所有的静态的对象/方法/属性,这个工作量是巨大的(如果万一不是?),所以为了减小风险,我准备改写最常用的类(如查职位,文章显示)为非静态方法,如果能有一些效果(如死机的频率减少),再作进一步修改.

3. 更换tomcat版本,排除tomcat旧版本bug引起的内存泄漏问题.
以下是一个blog上发现的,和我们的问题比较类似.
Tomcat 5.5.4有内存泄漏的问题,当我重新发布一个应用几次之后,Outofmemory:PermGen space,到apache的网站上找,说是5.5.8会修补这个问题。所以还是不要重新发布了,直接重起得了:)


4. 使用工具Jprofiler,实时监控服务器运行情况,当发现死机时,查看其内存使用情况,类和对象占用的内存大小等…

Jprofiler可以监控内存堆栈的分配和使用情况、对象建立的多少情况、cpu使用的情况,还可以针对每个类或每个对象或每个线程、或每个函数对内存、cpu的使用情况,还可以看java虚拟机中自动垃圾收集的运行情况

5. 使用测试工具loadrunner,加大负载,模拟并发的大访问量.


周末两天,服务器没有死,但内存已到了860M之多....
周一上午来上班的时候,就死了,还是java.lang.OutOfMemoryError: PermGen space的错误,
晕,...........


希望高手能在此讨论一下,怎么解决?????
...全文
2044 62 打赏 收藏 转发到动态 举报
写回复
用AI写文章
62 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinfei2003 2006-07-06
  • 打赏
  • 举报
回复
向大家学习中....
zhuangyan2004 2006-06-12
  • 打赏
  • 举报
回复
关注
Kamen_Wang 2006-05-19
  • 打赏
  • 举报
回复
问题差不多,跟着瞧
mgan 2006-05-02
  • 打赏
  • 举报
回复
MARK下
TinyJimmy 2006-05-02
  • 打赏
  • 举报
回复
看了楼上的文章, 颇有收获, 来个现炒现卖吧.
问题 java.lang.OutOfMemoryError PermGen space, 而PermGen space是用来装载Class的, 也就是说问题可能有
1. 装入的类过多
Class, jsp, Servlet 等都是属于装入的类范畴, 是否楼主的程序有动态编译的类? 随着应用推进, 装入的类就越多. 哼哼...挂机

2. 装入类的Loader错误, 已经装入的类被重复装入了
装入类都需要通过ClassLoader, 装入类前需要判断类是否已经装载, 叫什么方法来着忘了. 楼主是否有自己实现ClassLoader的方法? 还有一种可能, 就是Tomcat的loader有问题.

3. 虚拟机错误
对于正式版的虚拟机, 这种可能性不大, 有两种可能, 一种是是使用了测试版的VM, 另一种是虚拟机中毒了.

如果问题被不幸言重, 以楼主的智慧, 这不小菜嘛..

Good Luck!
liugmwx 2006-01-13
  • 打赏
  • 举报
回复
前一段时间我也是经常内存溢出,修改后现在系统运行正常。
内存溢出主要是你的字符串str+="abc"不断地在循环中加的时候,java本身对于字符串没有限制,但是jvm却有,如果你的长度太长就是java.lang.OutOfMemoryError
jin2005 2006-01-07
  • 打赏
  • 举报
回复
MARK一下,但我觉得不会是TOMCAT的问题。还是具体的找一下你的程序问题。如果你的程序有问题的话,不管用什么容器都一样.
liugmwx 2006-01-07
  • 打赏
  • 举报
回复
难道tomcat就不行吗?有没有好的办法能查出内存溢出的程序在那???
高手呢??
cnyxlxw 2006-01-07
  • 打赏
  • 举报
回复
严重同意 jin2005(小白) ( ) 信誉:99
csdnbig 2005-12-20
  • 打赏
  • 举报
回复
我们现在把服务器换成Redhat as4.0,内存溢出问题不再出现
windfromsky 2005-11-14
  • 打赏
  • 举报
回复
楼主google一下没有啊?
weekly123 2005-11-14
  • 打赏
  • 举报
回复
mark,,,,,,,,,,帮顶~~~
pigo 2005-11-14
  • 打赏
  • 举报
回复

到底是tomcat5.5.几啊???

是最新的tomcat吗???
用tomcat建议用bat 启动,少很多麻烦。






---------------
http://agilejava.blogbus.com/logs/2005/05/1180069.html
Tomcat 5.5.4有内存泄漏的问题,当我重新发布一个应用几次之后,Outofmemory:PermGen space,到apache的网站上找,说是5.5.8会修补这个问题。所以还是不要重新发布了,直接重起得了:)

tsylo 2005-11-14
  • 打赏
  • 举报
回复
内存溢出是由对象引起的,当你在一个对象里存储了一定量的值,开辟一定的内存空间,而第二此访问该对象时,又再次往这个对象中写入值,此时java虚拟机并没有及时有效的进行垃圾回收,导致内存空间不足,根据我自己的经验,一般vector,arraylist对象会比较多的出现这类问题。sun对此的解释如下:
* Thrown when the Java Virtual Machine cannot allocate an object
* because it is out of memory, and no more memory could be made
* available by the garbage collector.
垃圾回收是sun的一个问题。
处理办法可以有几种:
1,加大虚拟机内存,此方法楼上各位已经应用过
2,减小tomcat的最大访问线程数,那么当tomcat线程访问达到最大线程数的时候,其他线程进入等待状态
3,不用tomcat,使用resin服务器,此服务器可以调整使得服务器停止后自动重启。
4,找到溢出的对象,并且捕获异常进行处理
我使用的是第四种,这样比较容易控制。
flogyin 2005-11-14
  • 打赏
  • 举报
回复
也碰到过这问题,找了好久几乎到了绝望。
1. 内部的错误一定要捕捉处理好,尤其是一些复杂功能BEAN;
2. 搭配下不同的版本。
haodong2006 2005-11-14
  • 打赏
  • 举报
回复
学习ing
pds9902 2005-11-14
  • 打赏
  • 举报
回复
我是楼主,问题依然没有解决,我已将MaxPermSize设置为256M,还是java.lang.OutOfMemoryError: PermGen space的错误,郁闷...
难道真的没办法了么?????????
www203 2005-11-11
  • 打赏
  • 举报
回复
我做了一个监控小软件
如果死掉不能访问的时候就重新启动tomcat
楼主如果需要可以联系我
常遇道 2005-11-11
  • 打赏
  • 举报
回复
帮你顶!!!!!!!
wddodo 2005-11-11
  • 打赏
  • 举报
回复
学习学习!!
加载更多回复(41)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧