2012-02-08 30 views
2

我有應用程序的設置:-Xmx2048M,-Xms2048M,-XX:MaxPermSize = 256M。
有時我在日誌中得到了很多信息:OutOfMemoryError和卸載類sun.reflect.GeneratedMethodAccessor

[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中加載並且應該發生錯誤:

OutOfMemoryErro r:PermGen空間。

我的問題,爲什麼我有錯誤OutOfMemoryError:Java堆空間而不是
OutOfMemoryError:PermGen空間?

回答

2

這意味着你正在運行的堆空間(或者你有無法種植某種原因有一個空格)

你只有PermGen space.的原因,當此空間的最大耗盡。

簡而言之,您會收到此錯誤,因爲您的堆空間不能增長以容納其中的對象。

+0

感謝您的回覆。但是這個消息[卸載類sun.reflect.GeneratedMethodAccessor9]指出了Perm Gen中的問題,以及爲什麼我沒有得到OutOfMemoryError:PermGen空間,或者可能是第一個OutOfMemoryError:PermGen,然後是下一個OutOfMemoryError:Java堆空間? – luk4443 2012-02-08 14:37:02

+0

該消息表明PermGen已被清理。沒有比這更多。您將在「OOME Java堆空間」之前始終獲得完整的GC,並且將清理包括perm gen在內的所有區域(即使在那裏有足夠的空間) – 2012-02-08 15:11:33

+0

到目前爲止,我認爲這個OutOfMemoryError是由軟引用觸發的GC無法正常清潔時。但看來,OOME還有另一個原因? – luk4443 2012-02-08 17:34:09

0

就像@Peter說的那樣是一個堆問題。卸載是垃圾收集的一個副作用,並不表示任何事情都會發生錯誤。

下面是如何解決和防止奧姆斯:

  • 允許堆轉儲上熱點OOM -XX:+HeapDumpOnOutOfMemoryError,該選項沒有性能損失
  • 研究堆轉儲和理解,你有泄漏或過度使用堆,例如來自數據庫的巨大選擇。
  • 一旦你熟練掌握堆分析,在開發過程中通過jmap進行堆轉儲並分析泄漏。
  • 如果您認爲自己在生產中可能有泄漏:jmap -histo是一個不錯的選擇,因爲它只享受很少的性能。