我有应用程序设置:-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?
答案 0 :(得分:2)
这意味着你的堆空间不足(或者你有一个因某些原因无法增长的空间)
当此空间的最大值用完时,您只会获得PermGen space.
。
简而言之,您收到此错误是因为您的堆空间无法增长以容纳其中的对象。
答案 1 :(得分:1)
就像@Peter一样,这是一个堆问题。卸载是完整垃圾收集的副作用,并不表示出现任何问题。
以下是如何解决和阻止OOM:
-XX:+HeapDumpOnOutOfMemoryError
上的堆转储,该选项没有性能损失jmap -histo
是一个不错的选择,因为它只有很少的表现。