2012-01-11 23 views
0

當我的webapp使用spring,hibernate和tiles時,我似乎遇到了內存泄漏問題。我認爲這可能是由於我的應用程序在部署之後沒有自行清理。我部署和部署很多,因爲我目前正在學習所有這些框架。spring 3.1,hibernate 4,tiles2,tomcat 7 - 清理(多個部署導致內存泄漏)

在我的web應用程序中應該做些什麼來清理?我目前沒有做任何事情,因爲我認爲Java自動進行內存清理,但是我很確定它在春季來臨時並沒有做任何事情,因爲tomcat不停地抱怨permgen內存。

我很困惑我是否需要運行某些方法來保持乾淨。我讀過關於在某處註冊應用程序的Spring鉤子,然後在關閉應用程序時正確清理了它?我不確定這樣的事情是否有必要,但在新版本的彈簧中(3.1)

例如,tomcat一直告訴我,我沒有正確註銷JDBC驅動程序(但我認爲tomcat會自動執行此操作如果它被檢測到)。

我明白這是一個非常含糊的問題,但如果有人可以提到某些事情需要做,以防止我的應用程序泄漏,我可以自己爲他們谷歌。

謝謝!

+0

它是否會導致perm gen空間錯誤? – Ralph 2012-01-11 06:21:25

+0

通過檢查tomcat中是否有任何ERROR日誌語句來檢查部署是否正確。另外,如果tomcat說JDBC驅動程序沒有正確註冊,那麼它需要注意。檢查jdbc驅動程序庫是否存在於類路徑中。 – Gaurav 2012-01-11 06:24:17

回答

1

無論如何,只要可能,您應該在部署新版本之前關閉生產tomcat。 (這需要有兩個tomcats一個故障轉移機制,或者你只是接受服務停機一秒鐘,而不僅僅是一個更新。)

我知道,這是唯一的方法來確保一個內存泄漏(考慮燙髮)也不會做任何有害的事情。

0

這聽起來像我使用Hibernate的項目中的問題。

Hibernate爲您使用的每個域對象生成代理。這些代理保留在永久生成空間下,並且在應用程序重新啓動/重新部署時不會被清除。 PermGen空間使用的內存量默認情況下相對較小,因此您可以嘗試使用-XX:MaxPermSize java參數增加它。這可能會改善時間,然後您收到一個內存錯誤,但沒有一個我知道這個問題的完整解決方案。你將不得不重啓tomcat它自己最終。

對於jdbc問題首先,如果您手動使用連接,請確保它在try catch finally塊中正確關閉。如果您不使用連接對象,那麼它可能會與Hibernate再次相關。

+0

是的,我已將maxpermsize參數增加到256mb。這有助於重新啓動之間的時間,但我希望有某種方法可以防止重新啓動。 另外。與jdbc問題,我不得不看看。我並不是那麼熟悉hibernate,所以我不知道我是否必須自己做,或者它是否適合我?我認爲休眠會照顧所有這一切自動 – Fittersman 2012-01-12 00:57:10

2

Hibernate 4.0引入了jboss-logging作爲依賴,這似乎會導致permgen泄漏(請參閱https://issues.jboss.org/browse/JBLOGGING-66)。

我不知道可以做些什麼來正確地解決它,但作爲一種解決方案將jboss-logging jar移動到tomcats lib目錄似乎工作。

+0

看到這種可能的修復http://stackoverflow.com/a/32412984/185565 – Whome 2015-09-05 12:38:45