2010-10-11 50 views
2

這是我一直以來的老問題。我想在開發環境中重新部署。經過一些部署後,我耗盡了permgen,不得不殺掉服務器。多年前我試圖找到解決問題的辦法,但發現Spring和Hibernate相互指責這個問題。有沒有找到解決方案?重新部署時,是否仍然無法擺脫PermgenSpace異常?

Spring Roo聲稱它不會在運行時生成類,所以它不會成爲問題。它是否真的有效,如果有,我該如何配置我的應用程序?

我知道這裏有兩個問題,但如果你能回答一個就足夠了:)

+1

只是增加服務器的永久空間 – 2010-10-11 13:13:03

+1

是的,這一直是「解決方案」,我不滿意。它不能解決問題。 – palto 2010-10-11 13:18:34

回答

2

如果您在linux下運行您的應用程序,那麼使用IBM JRE運行您的應用程序將解決此問題。

+0

IBM JRE是否支持Java 6?看起來像他們只支持高達1.5 – palto 2010-10-18 06:30:47

+0

是的,它的確如此:請參閱https://www.ibm.com/developerworks/java/jdk/linux/download.html – 2011-01-15 08:08:20

0

有一對夫婦的事情,可以用一些這方面的幫助。 Spring有一個「IntrospectionCleanupListener」,可以幫助一點點。如果您要在Web應用程序中加載和創建JDBC連接,則可以有一個servlet上下文偵聽器,它將取消註冊您在應用程序中加載的驅動程序。這些幫助,但不完全解決問題。

5

據我瞭解,典型的PermGen存儲泄漏是這樣的。

  1. 某處存在對某些對象的可達引用,該對象的類已被熱部署取代。

  2. 該對象具有對其類描述符的引用。

  3. 該類描述符具有對其ClassLoader的引用。

  4. ClassLoader對所有已加載的類的類描述符都有引用。

  5. 每個類描述符都具有對靜態幀,其字節碼,其本地代碼等的引用。

對一個物體的一個引用足以導致泄漏泄漏。如果可能是一個枚舉值,聽衆還沒有被註冊,...

編輯

由誰遇到這樣的問題是聳聳肩膀,增加PermGen的堆人所採取的慣常做法尺寸。如果你真的需要解決這個問題爲您的Web應用程序(一個或多個),然後:

  • 看看你的web應用程序關閉,確保數據庫連接/連接池被關閉,一路回調未登記,等
  • 使用Java內存分析器跟蹤由重新部署觸發的PermGen(和其他)內存泄漏。
  • 準備好重複這個過程,如果新的泄漏是隨着你的webapp的發展而引入的。

我不知道Hibernate是否存在特定問題,但是任何複雜的框架都可能會受到這種問題的影響,無論是單獨還是與應用程序代碼結合使用。

+0

你是否知道在使用Hibernate時總會發生這種情況,還是我可能犯的一個錯誤?有沒有辦法來檢測這些泄漏? – palto 2010-10-11 18:16:00