2013-07-22 59 views
2

運行企業級應用程序的Tomcat。得到「Permgen內存不足」的消息。Permgen內存不足

我上運行此:

的Windows 2008 R2服務器, 的Java 1.6_43,0​​運行Tomcat作爲一項服務。

沒有多個部署。服務已啓動,App運行。最終我得到Permgen錯誤。

我可以通過增加perm尺寸來延遲錯誤,但是我想要真正解決這個問題。供應商不同意這個問題。我不知道這是否是內存泄漏,因爲供應商只是說「Jrockit運行良好」。 Ofc,如果是3mos之前的文檔,那將會很不錯。另外,有些帖子提示Jrockit只是擴展了permspace以適應,如果你有mem(不確定是否準確...),則可以達到4gb。

反正我看到在Java 1.5中的一些職位,可能的解決與選項 「-XX:+ CMSClassUnloadingEnabled -XX:+ CMSPermGenSweepingEnabled」

然而,這些似乎都在Java 1.6的被棄用,現在唯一可用的GC是「-XX:+ UseG1GC」。

我能找到的最好的鏈接,在任何地方,就是: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options

有誰知道,如果新的G1垃圾收集器包括permspace?或者我在新的Java6 GC設置中遺漏了一個選項或2,這可能是我不理解的?

任何幫助表示讚賞!

+0

您是否在不重新啓動tomcat的情況下多次進行部署?如果是這樣,我認爲這是由於Tomcat中的錯誤。 – kosa

+0

@Nambari鏈接到這個bug? – hexafraction

+1

@hexafraction:有很多關於這個bug的討論,這裏有一個例子:http://www.coderanch.com/t/590332/Tomcat/Java-lang-memory-exception-Pergem – kosa

回答

1

我不會只是增加permgen空間,因爲這個錯誤通常是軟件/設置中出現錯誤的跡象。他們是一個特定的Web應用程序導致此?沒有更多信息,我只能提供基本的建議。

1)使用內存泄漏檢測器(Tomcat的6+)稱爲Find Leaks

2)關閉自動部署

3)移動JDBC驅動程序和記錄軟件,以Java類路徑,而不是每this Tomcat的博客條目

+0

我已經多次使用了內存泄漏檢測器,但沒有發現任何泄漏。當應用程序死亡時,Tomcat也會死亡(儘管服務仍然「啓動」)。所以,在那個時候,檢查泄漏是不可能的。我看看自動部署,但我不確定這是如何相關的?驅動程序現在位於java classpath中。 -謝謝! – user2607841

0

在較早版本的Sun Java 1.6中,CMSPermGenSweepingEnabled選項僅在設置了UseConcMarkSweepGC時纔有效。見這些問題的答案:

我不知道這是否是在1.6以後版本的功能雖然。

過去這些錯誤/錯誤的常見原因是動態類生成,特別是對於創建動態代理或使用方面的庫和框架。微妙的濫用Spring和Hibernate(或更具體的cglib和/或aspectj)是常見的罪魁禍首。根本問題在於,每個請求都會創建新的動態類,最終耗盡了擴展空間。 CMSPermGenSweepingEnabled選項是常用的解決方法/修復。這些框架的最新版本不再有問題。