2013-08-16 50 views
0

Iam在我的應用程序中使用Tomcat 6,spring,hibernate和struts。我經常在有關內存的日誌中看到此異常,並且該網站掛起並停止響應。 Iam不知道什麼是錯的。任何人都可以建議做些什麼改變來避免這種情況。Tomcat - PermGen空間異常

org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable運行 重度:捕捉到異常:執行[email protected](java.lang.OutOfMemoryError PermGen的空間),終止線程

+0

可能重複[如何防止Netbeans中的PermGen空間錯誤?](http://stackoverflow.com/questions/673646/how-can-i-prevent-permgen-space-errors-in-netbeans) – bummi

回答

2

PermGen空間是Tomcat用來存儲類定義(僅限定義,沒有實例化)和已被實現的字符串池的內容。從經驗來看,PermGen空間問題往往在開發環境中經常發生,因爲Tomcat每次部署WAR或執行jspc(編輯jsp文件時)都必須加載新類。就我個人而言,當我在進行開發測試時,我傾向於部署和重新部署戰爭,所以我知道我必然遲早會用完(主要是因爲Java的GC週期仍然有點廢話,所以如果您快速頻繁地重新部署戰爭足夠的空間填滿比他們可以管理更快)。

從理論上講,這應該不是生產環境中的問題,因爲您(希望)不會在10分鐘的基礎上更改代碼庫。如果它仍然存在,那就意味着你的代碼庫(和相應的庫依賴)對於默認的內存分配來說太大了,你只需要解決堆棧和堆的分配問題。我認爲標準是這樣的東西:

-XX:MaxPermSize參數= SIZE 但是我發現,以充分利用良好的照顧最好的辦法是允許類被卸載,以便您的PermGen從來沒有用完:

-XX:+ CMSClassUnloadingEnabled -XX:+ CMSPermGenSweepingEnabled 這樣的東西對我來說是過去的魔法。有一件事情,在使用這些方面存在顯着的性能折衷,因爲permgen掃描會使您對每個請求做出額外的2個請求或沿着這些線索做出某些事情。你需要平衡你的使用和權衡。

+0

如你所建議的變化和從幾天的力量得到這個錯誤.....希望這個wud繼續。 thnx :) – Santosh