java.exe占用的内存越来越多……直到出现java.lang.OutOfMemoryErr...

temp1898 发布于 2011/05/19 00:41
阅读 5K+
收藏 2

最近才发现TOMCAT启动一段时间后,总是出现java.lang.OutOfMemoryError PermGen space这个错误,后来搜索到答案称:这一部分用于存放ClassMeta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放InstanceHeap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APPLOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。根据提示,修改TOMCAT_HOME/bin/catalina.sh
echo "Using CATALINA_BASE:   $CATALINA_BASE"上面加入以下行:

JAVA_OPTS="-server -Xms800m -Xmx800m  -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

仍然不行。

打开任务管理器查看内存使用情况,发现,刚启动TOMCAT时JAVA.EXE使用内存在35M左右,后打开网页浏览,每点一个链接JAVA.EXE占用的内存不断增加,不会降低,即便是关闭所有浏览页内存也不会降,当内存占到140多M时出现java.lang.OutOfMemoryError PermGen space这个错误,我想内存占用不应该只增不降,应该是本人代码的问题,但不知如何下手去查,请各位老师指点,谢谢了……

加载中
0
xmdeepdata
xmdeepdata

内存溢出

1、检查代码是否open了本地IO,而且没有及时release

2、检查代码是否存在不合理的递归程序

3、文件(图片)上传程序是否有问题?

4、应用是否包含了较大的对象(如包含超大文本),而且被单例实例持续引用着

5、最后用JProfile跟踪下类的实例引用情况

6、最笨的办法就是停止所有功能,然后逐个加上去并排查。

0
Z
ZYud

http://www.brokenbuild.com/blog/2006/08/04/java-jvm-gc-permgen-and-memory-options/

和你的问题应该一致。跟踪类的载入情况,看是否一直有新的类产生。

0
SeekerLee
SeekerLee

PermGen permanent generation hotspot中的永久带,实现虚拟机规范中的方法区method area。这部分内存几乎不会回收的。类载入太多了才会oom。

方法区中存放了每个Class的结构信息,包括常量池、字段描述、方法描述等等。

上文讲过,方法区用于存放Class相关信息,所以这个区域的测试我们借助CGLib直接操作字节码动态生成大量的Class,值得注意的是,这里我们这个例子中模拟的场景其实经常会在实际应用中出现:当前很多主流框架,如SpringHibernate对类进行增强时,都会使用到CGLib这类字节码技术,当增强的类越多,就需要越大的方法区用于保证动态生成的Class可以加载入内存。

参见此帖:http://icyfenix.iteye.com/blog/802573

查问题的话,-XX:-TraceClassLoading或-verbose:class

不过打印量很大,要仔细看。

0
逝水fox
逝水fox

我们是一般会每天重启一次tomcat释放一下内存

在高点击的情况下 Tomcat会输出这个异常,估计是最后有什么资源没有回收

java.util.ConcurrentModificationException

        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:448)

        at java.util.AbstractList$Itr.remove(AbstractList.java:433)

        at java.util.AbstractCollection.remove(AbstractCollection.java:255)

        at org.apache.coyote.RequestGroupInfo.removeRequestProcessor(RequestGroupInfo.java:17)

        at org.apache.coyote.RequestInfo.setGlobalProcessor(RequestInfo.java:96)

        at org.apache.coyote.http11.Http11Protocol$MXPoolListener.threadEnd(Http11Protocol.java:620)

        at org.apache.tomcat.util.threads.ThreadPool.removeThread(ThreadPool.java:279)

        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:727)

        at java.lang.Thread.run(Thread.java:534)

0
SeekerLee
SeekerLee

引用来自#5楼“YiChen”的帖子

我们是一般会每天重启一次tomcat释放一下内存

在高点击的情况下 Tomcat会输出这个异常,估计是最后有什么资源没有回收

java.util.ConcurrentModificationException

        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:448)

        at java.util.AbstractList$Itr.remove(AbstractList.java:433)

        at java.util.AbstractCollection.remove(AbstractCollection.java:255)

        at org.apache.coyote.RequestGroupInfo.removeRequestProcessor(RequestGroupInfo.java:17)

        at org.apache.coyote.RequestInfo.setGlobalProcessor(RequestInfo.java:96)

        at org.apache.coyote.http11.Http11Protocol$MXPoolListener.threadEnd(Http11Protocol.java:620)

        at org.apache.tomcat.util.threads.ThreadPool.removeThread(ThreadPool.java:279)

        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:727)

        at java.lang.Thread.run(Thread.java:534)

这貌似是迭代过程中修改本身造成的。

0
逝水fox
逝水fox

引用来自#6楼“SeekerLee”的帖子

引用来自#5楼“YiChen”的帖子

我们是一般会每天重启一次tomcat释放一下内存

在高点击的情况下 Tomcat会输出这个异常,估计是最后有什么资源没有回收

java.util.ConcurrentModificationException

        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:448)

        at java.util.AbstractList$Itr.remove(AbstractList.java:433)

        at java.util.AbstractCollection.remove(AbstractCollection.java:255)

        at org.apache.coyote.RequestGroupInfo.removeRequestProcessor(RequestGroupInfo.java:17)

        at org.apache.coyote.RequestInfo.setGlobalProcessor(RequestInfo.java:96)

        at org.apache.coyote.http11.Http11Protocol$MXPoolListener.threadEnd(Http11Protocol.java:620)

        at org.apache.tomcat.util.threads.ThreadPool.removeThread(ThreadPool.java:279)

        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:727)

        at java.lang.Thread.run(Thread.java:534)

这貌似是迭代过程中修改本身造成的。

是啊 但是问题是出在Tomcat线程池的代码里面...而且还是removeThread的时候...

0
temp1898
temp1898

非常感谢大家的指点,虽然有些还看不懂^_^,不过我边学边试一下,谢谢了哈……

0
老姜头
老姜头

你先用jvisualvm之类的工具看下,把场景发出来看看,不然我们只能猜啊!

返回顶部
顶部