簡體   English   中英

多個應用中的內存泄漏

[英]Memory Leak in multiple apps

我在Tomcat 6.0.35服務器中的兩個應用程序中出現內存泄漏,這些應用程序“無處不在”。 一個應用程序是Solr,另一個是我們自己的軟件。 我希望有人之前看過這個,因為過去幾周我一直在發生這種情況,我必須在生產環境中繼續重啟Tomcat。

它出現在我們的原始服務器上,盡管事實上沒有觸及與線程或數據庫連接操作相關的代碼。 由於這個應用程序運行的舊服務器已經退役,我將網站遷移到新服務器和“更清潔”的環境,其想法可以清除任何遺留的東西。 但它仍在繼續發生。

就在Tomcat關閉catalina.out之前,日志中充滿了以下錯誤:

2012-04-25 21:46:00,300 [main] ERROR org.apache.catalina.loader.WebappClassLoader- Web應用程序[/ AppName]似乎已經啟動了一個名為[MultiThreadedHttpConnectionManager cleanup]的線程,但未能將其停止。 這很可能造成內存泄漏。

2012-04-25 21:46:00,339 [main] ERROR org.apache.catalina.loader.WebappClassLoader- Web應用程序[/ AppName]似乎已經啟動了一個名為[com.mchan ge.v2.async.ThreadPoolAsynchronousRunner $的線程PoolThread-#2]但未能阻止它。 這很可能造成內存泄漏。

2012-04-25 21:46:00,470 [main] ERROR org.apache.catalina.loader.WebappClassLoader- Web應用程序[/ AppName]仍在處理尚未完成的請求。 這很可能造成內存泄漏。 您可以使用標准Conte xt實現的unloadDelay屬性來控制請求完成所允許的時間。

在遷移期間,我們從Solr 1.4-> Solr 3.6開始嘗試解決問題。 當上面的錯誤開始填充日志時,下面的Solr錯誤緊隨其后10-15次,然后tomcat停止工作,我必須關閉並啟動才能讓它響應。

2012-04-25 21:46:00,527 [main] ERROR org.apache.catalina.loader.WebappClassLoader- Web應用程序[/ solr]創建了一個類型為[org.a pache.solr.schema.DateField]的密鑰的ThreadLocal。 ThreadLocalDateFormat](value [org.apache.solr.schema.DateField$ThreadLocalDateFormat@1f1e90ac])和類型為[org.apache.solr的值]。 schema.DateField.ISO8601CanonicalDateFormat](value [org.apache.solr.schema.DateField$ISO8601CanonicalDateFormat@6b2ed43a])但是當Web應用程序停止時無法將其刪除。 這很可能造成內存泄漏。

我的研究提出了很多關於更改管理線程的代碼的建議,以確保它們能夠扼殺數據庫池連接等,但這段代碼在近12個月內沒有改變。 Solr應用程序崩潰了,那是第三方所以我的想法是這是環境的(jar沖突,版本控制,配置胖指法?)

我的最后一個更改是將java的mysql連接器更新到最新版本,因為早期版本中的池中存在一些內存泄漏錯誤,但服務器僅在幾個小時后再次崩潰。

我剛注意到的一件事是我在Tomcat Web管理器中看到了數千個會話,但這可能是一個紅色的鯡魚。

如果有人看到這個任何幫助非常感謝。

[編輯]

我想我找到了問題的根源。 畢竟這不是內存泄漏。 我接管了另一個開發團隊的應用程序,該團隊使用c3p0通過Hibernate進行數據庫池化。 c3p0有一個錯誤/特性,如果你沒有釋放數據庫連接,一旦使用所有連接(通過MaxPoolSize:默認值為15),c3p0就可以進入等待狀態。 它將無限期地等待連接變為可用。 因此我的攤位。

我首先從25-> 100增加了MaxPoolSize,我的應用程序運行了幾天沒有掛起,然后從100-> 1000,從那以后(超過2周)它一直運行穩定。

這不是完整的解決方案,因為我需要找出它為什么用完池連接所以我還將c3p0的unreturnedConnectionTimeout設置為4hrs,這對所有連接強制執行4小時的時間限制,無論它們是否處於活動狀態。 如果它是活動連接,它將關閉它並再次重新打開。

不漂亮,c3p0不推薦它,但它給了我一些喘息的空間來找出問題的根源。

注意:將c3p0與Hibernate一起使用時,設置存儲在persistence.xml文件中,但並非所有設置都可以放在那里。 某些設置(例如unreturnedConnectionTimeout )必須放在c3p0.properties中

您聲明事件的順序是:

  • 出現錯誤
  • Tomcat停止響應
  • 需要重啟

但是,僅在Web應用程序停止時才會報告內存泄漏錯誤消息。 因此,某些事情會觸發Web應用程序停止(或重新加載)。 你需要弄清楚是什么觸發它並停止它。

關於實際泄漏,您可能會發現這很有用:

http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf

它看起來你的應用程序和Solr有一些需要修復的泄漏。 演示文稿將為您提供一些指導。 我還會考慮升級到最新的7.0.x. 內存泄漏檢測已得到改進,並非所有改進都已進入6.0.x。

暫無
暫無

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

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