簡體   English   中英

Tomcat-Spring-Hibernate Web應用程序中的“PermGen out of space”異常可以做些什么?

[英]What can be done with 'PermGen out of space' exception in Tomcat-Spring-Hibernate web application?

我們有一個Web應用程序,它使用Spring-Hibernate將注冊用戶數據保存在Oracle數據庫中。 該應用程序在開發環境中運行良好,但是當我們在具有更多數據的實時環境中復制它時,它失敗了。 最初應用程序正常啟動,但在幾次操作之后發生'PermGen out of space'異常。

我已經開始在Google,Spring和Hibernate論壇中搜索,但它沒有幫助。 關於這個錯誤有很多討論,但是對於每個解決方案,都有人說:“它有效”而其他人說'它沒有'。

例如,許多人提出增加-XX:MaxPermSize JVM參數,其他人說它不起作用。 有帖子說需要使用javassist庫和其他庫以及cglib庫的問題。 其他人說問題出在cglib上。

我們使用Java1.5_0_09,Spring 2.5和javaassist3.4.GA,Tomcat 5.5作為web容器,Oracle 10g作為數據庫。

任何人都能解釋一下導致這個問題的原因以及如何解決這個問題?

-XX:MaxPermSize確實有效,你必須得到正確的價值。 我相信默認情況下,客戶端模式VM為32mb,服務器模式VM為64mb。 如果你有記憶,我建議把它設置為256mb:

java -XX:MaxPermSize=256m

出現這個問題是因為Spring和Hibernate可能會大量使用運行時生成的類,有時會使用很多類。 這些生成的類都進入PermGen內存池,因此如果您使用這些框架,您通常需要將PermGen提升到大量。

您必須意識到某些版本的Tomcat在戰爭重新部署時存在內存泄漏。 它發生在tomcat 6.0.x上。

如建議增加MaxPermSize ,這是您的開發機器的臨時解決方案 - 當您收到錯誤時,2-3天后,只需重新啟動服務器。 生產並不那么簡單。 所以這適用於開發 ,但這種方法不適用於生產 ,你應該修復內存泄漏問題。

要發現泄漏,請使用jdk 1.6和1.5附帶的jconsole應用程序。 您可以綁定到進程,並觀察一段時間內使用的內存。

你也可以閱讀這些:

我已經看到了Hibernate的這個問題(沒有Spring使用)。 問題在於我們為每個用戶請求創建了一個SessionFactory實例,而不是為應用程序的生命周期創建單個實例。

我使用YourKit分析器來調查此問題並發現問題。

正如skaffman所說-XX:MaxPermSize屬性確實有效,但有時你可能會遇到一個潛在的問題,即提高限制可能只會推遲。

你看過這張紙條嗎? 它幫我解決了一次類似的問題。 總結鏈接:

  • 將JDBC驅動程序放在common / lib中(如tomcat文檔所述 )而不是WEB-INF / lib
  • 不要將commons-logging放入WEB-INF / lib,因為tomcat已經引導它了

Visual GC現在是JDK 6的一部分,它實時提供了非常好的內存圖形表示。 你可以看到伊甸園,世代和燙發空間發生了什么。 你只是不明白為什么。

更新:這是我的JDK 1.6.0_13發行版中的bin / jvisualvm.exe。 為它提供要監視的進程的PID。

這里的所有響應都與由於web-app的多次重啟而發生的PermGen問題有關,但是在這種情況下,問題已經在tomcat重啟后的第一次部署時發生,因此它不能成為ClassLoader的引用或公共日志記錄的問題。

如果您在jdk6上運行,那么您可以使用jconsole應用程序來監視應用程序的內存使用情況並進一步調查。

另一種追求的途徑是使用分析器,我使用JProfiler,並用它來看看應用程序。 它會告訴您問題的確切來源。

我遇到了同樣的問題,我讀過 Tomcat是這種情況的罪魁禍首。

然后我切換到碼頭,一切都變得很棒,應用程序按預期部署/運行。 因此,如果tomcat不是必須的,那么我建議Jetty。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM