qiuyu900205 2013-04-20 18:43
浏览 295
已采纳

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缓存!

  • 写回答

2条回答 默认 最新

  • yunzhu666 2013-04-20 19:06
    关注

    昨天也有热问这个问题:
    [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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站