2009-01-23 56 views
19

我一直在Tomcat 6服務器上收到「PermGen」錯誤。Tomcat 6中反覆出現的「PermGen」6

我知道是什麼應用程序導致問題,但我不知道它爲什麼這樣做。該應用程序正在使用MySQL 5並在JDK 6上運行。

是否有任何工具/建議來診斷或分析特定應用程序的潛在問題?

謝謝

+0

是這個問題不是一個[此處描述(http://stackoverflow.com/questions/1124131/what-c​​an-be-done有什麼不同-with-PermGen的出空間不足的異常功能於Tomcat的春眠)? – 2011-02-24 15:01:03

+0

我推薦閱讀[本文](http:// plumbr。eu/blog/what-is-a-permgen-leak)(由我撰寫),以更好地理解爲什麼會發生這些錯誤。它還包含一些解決它們的建議。 – Nikem 2012-07-12 12:50:58

回答

25

PermGen用於存儲類定義和interned字符串池。您的代碼可能會填充它(如果它不必要地調用intern),但更可能是您的應用程序的默認值較小。

這是因爲每次部署WAR時Tomcat都會加載新類 - 或者如果您正在開發環境中工作,則每次編輯JSP時都會加載新類。那些應該最終得到清理,但在一個活躍的開發環境中,你可以有加載新舊實例的時間段。或者,如果您處於生產環境中並擁有大型網絡應用程序,則可能只需要更多空間。

要設置PermGen的大小,使用-XX:MaxPermSize=SIZE

以下鏈接可能會有所幫助:tuning GC(這是1.5版),GC FAQ(1.4.2版),Hotspot VM options(我相信這是1.6)

+0

感謝您的回覆,我會研究您的所有建議。 – 2009-01-23 14:32:06

2

我想你的應用程序中可能有很多JSP。在tomcat中有一個已知的問題,那就是用許多JSP重新啓動已部署的應用程序會導致PermGen問題,因爲tomcat會重新編譯並重新加載所有這些類。如前一篇文章中提到的增加大小應該有所幫助。

1

我已經看到了很多的PermGen錯誤時,Tomcat是一個代碼改變後,當Hibernate和重新加載春天,我認爲這是由於記錄器/ ehcache實例沒有正確關閉。

2

我同意用-XX:MaxPermSize增加permgen空間只會延遲問題。我試圖增加permgen,然後在向服務器發送更多請求之後,我開始收到相同的錯誤。 建議使用-XX:+ CMSClassUnloadingEnabled等附加標誌,即使它會降低性能。

3

嘗試這樣的:在Linux機器

export JAVA_OPTS="-XX:PermSize=128m"