tomcat 永久堆内存溢出?

tomcat 中  PermGen space 加大到1G,但是还是

java.lang.OutOfMemoryError: PermGen space

at sun.misc.Unsafe.defineClass(Native Method)

at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:45)

at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:381)

at java.security.AccessController.doPrivileged(Native Method)

at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:377)

at sun.reflect.MethodAccessorGenerator.generateSerializationConstructor(MethodAccessorGenerator.java:95)

at sun.reflect.ReflectionFactory.newConstructorForSerialization(ReflectionFactory.java:313)

at java.io.ObjectStreamClass.getSerializableConstructor(ObjectStreamClass.java:1322)

at java.io.ObjectStreamClass.access$1500(ObjectStreamClass.java:50)

at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:435)

at java.security.AccessController.doPrivileged(Native Method)

at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:411)

at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:308)

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1114)

at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)

at java.util.HashMap.writeObject(HashMap.java:1000)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:940)

at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)

at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)

at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)

at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)

at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)

at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)

at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)

at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)

 

注(sping3.05+hibernate3.6),同时使用了Enchache缓存!

昨天也有热问这个问题:
[url]http://www.iteye.com/problems/94307[/url]

把在那里回答的拷贝一下。

[b]先解释下PermGen space[/b]
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,[color=red]GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。[/color]

[b]引起问题的原因分析[/b]
注意红色部分,如果加载的class太多就可能产生这个问题。
我也曾经遇到过这种问题,并且在博客中写过:
异常:java.lang.OutOfMemoryError: PermGen space
[url]http://yunzhu.iteye.com/blog/1035741[/url]

我遇到的这个问题,引起的原因是自定义ClassLoader重复加载了很多次相同的jar,所以只要避免重复加载同样的jar就可以解决问题了。

所以可能的原因有:
1、加载了太多的class
2、加载了太多的jar
3、重复加载了太多的jar

[quote]tomcat 中PermGen space 加大到1G,但是还是
java.lang.OutOfMemoryError: PermGen space[/quote]
说明一味加大PermGen space已经没用了,肯定是应用中存在问题。
[color=red]上述原因1和2的可能性不大,哪能有1G这么多啊!
3的可能性比较大,是不是重复加载了jar文件,看看我的那篇博客,是否存在跟我一样的问题场景。[/color]

如果调整这么大了还是内存溢出
at java.util.HashMap.writeObject(HashMap.java:1000)
从这里看是写HashMap 估计是一直加载类(你在程序里有没有动态创建类?) 一直不释放 你使用如下命令(具体去查下) jmap -permstat 打印持久代 看看到底么情况 可参考这篇我的回复
[url]http://www.iteye.com/problems/94307[/url]

或者如果你是window的 可以使用jvisualVM 的抽样器 看看Perm Gen 哪些对象占内存