2010-07-26 40 views
9

我正在研究有關Java 6 18 VM上垃圾回收的各種選項,並希望獲得一些指針。解決PermGen問題的各種選項

我們在JBoss上運行我們的應用程序,並偶爾在重新部署過程中出現臭名昭着的PermGen錯誤。互聯網上有許多相互矛盾和過時的信息,說明解決或緩解這個問題的最佳方法。

what I can see,以下是正確的:

  • 自己VM選項將不解決此問題,只能推遲了。
  • 解決此問題的唯一可靠方法是修復Application Server本身(不太可能)或運行在Application Server中的代碼(我們的代碼或第三方庫)中的編碼錯誤(更可能)。 Permgen的填充通常是由應用程序類加載器加載到由Application Server類加載器加載的對象的引用的結果,從而防止垃圾回收應用程序的類加載器。

我有兩個問題由此產生:

  1. 就是上面是否正確?
  2. 虛擬機選項CMSClassUnloadingEnabledCMSPermGenSweepingEnabled是從哪裏來的?從我所看到的CMSClassUnloadingEnabled取代或暗示啓用CMSPermGenSweepingEnabled。他們中的任何一個能幫助解決上述問題?

回答

6

遺憾的是,答案是:

  1. 這些VM選項只會推遲問題。

基本問題是,GC不會垃圾收集一個強烈可及的對象。你需要弄清楚爲什麼這些舊的應用程序類加載器在重新部署後仍然可以訪問並修復泄漏。

或者,放棄熱生產服務器上的重新部署,或者更頻繁地重新啓動Web容器(例如JBoss)。

+0

禁用生產服務器上的熱部署。實際上,我傾向於爲開發人員工作站環境以外的其他任何應用程序執 – 2014-04-24 14:11:57