OutOfMemoryError和Unloading类sun.reflect.GeneratedMethodAccessor

时间:2012-02-08 13:59:11

标签: java garbage-collection

我有应用程序设置:-Xmx2048M,-Xms2048M,-XX:MaxPermSize = 256M。
有时我会在日志中收到很多消息:

[Unloading class sun.reflect.GeneratedMethodAccessor9]  
[Unloading class sun.reflect.GeneratedMethodAccessor129]  
[Unloading class sun.reflect.GeneratedMethodAccessor12]  
[Unloading class sun.reflect.GeneratedMethodAccessor11]  
[Unloading class sun.reflect.GeneratedMethodAccessor12]  
[Unloading class sun.reflect.GeneratedMethodAccessor11]  
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor29]  
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor25]  

并收到错误:

OutOfMemoryError:Java堆空间

阅读本文后:
http://anshuiitk.blogspot.com/2010/11/excessive-full-garbage-collection.html
我知道,这些类在Perm Gen中加载并且应该发生错误:

OutOfMemoryError:PermGen space。

我的问题,为什么我有错误OutOfMemoryError:Java堆空间而不是
OutOfMemoryError:PermGen space?

2 个答案:

答案 0 :(得分:2)

这意味着你的堆空间不足(或者你有一个因某些原因无法增长的空间)

当此空间的最大值用完时,您只会获得PermGen space.

简而言之,您收到此错误是因为您的堆空间无法增长以容纳其中的对象。

答案 1 :(得分:1)

就像@Peter一样,这是一个堆问题。卸载是完整垃圾收集的副作用,并不表示出现任何问题。

以下是如何解决和阻止OOM:

  • 允许热点上的OOM -XX:+HeapDumpOnOutOfMemoryError上的堆转储,该选项没有性能损失
  • 研究堆转储并了解堆泄漏或过度使用堆的位置,例如:巨大的选择来自数据库。
  • 一旦熟练掌握堆分析,在开发过程中通过jmap进行堆转储并分析泄漏。
  • 如果你认为你的制作可能有泄漏:jmap -histo是一个不错的选择,因为它只有很少的表现。
相关问题