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 哪些对象占内存