2011-09-09 46 views
1

我有一個部署在Tomcat 6服務器上的Grails應用程序。應用程序運行良好一段時間(一兩天),但是隨着時間的推移會慢慢消耗越來越多的內存,直到它停下來然後超過最大值。一旦我重新啓動容器,一切都很好。我一直使用grails JavaMelody插件以及應用程序信息插件來驗證這一點,但我需要幫助確定我應該尋找的內容。Tomcat 6 Web應用程序隨時間耗盡內存

這聽起來像是一個應用程序泄漏,但據我所知,沒有任何非託管資源的訪問。此外,Hibernate緩存似乎在檢查。看起來如果我運行垃圾回收器,我會得到相當可觀的內存塊,但我不知道如何可持續地執行此操作。

所以:

  • 我如何使用這些(或其它)監視工具找出問題出在哪裏?
  • 有沒有其他建議可以幫助我?

非常感謝。

編輯

我使用的Grails 1.3.7,我現在用的石英插件。

+0

您使用的是Quartz插件嗎?另外,你使用的是什麼版本的Grails? –

+0

@Joshua Moore - 查看我的編輯。謝謝。 – skaz

+0

我有同樣的問題。在Quartz中使用Grails 1.3.6(儘管我不確定這是否是實際問題)。雖然我需要每隔幾周重新啓動一次,所以我的問題不是那麼迫在眉睫。 – wwwclaes

回答

2

您可以使用Oracle JDK中的VisualVM應用程序在運行時(如果已使用Oracle JVM)連接到Tomcat實例來檢查發生了什麼。內存分析器可以告訴你很多,並指出你在正確的方向。您最有可能尋找增長對象或分配越來越多的對象類型。

如果您需要的不僅僅是免費的VisualVM應用程序可以告訴您的商業分析器,可能會有用。

+0

我可以遠程使用它嗎? – skaz

+0

也許,但不是那麼容易。您需要配置Tomcat JVM以公開JMX端口。 –

+0

它可能與數據庫連接池有關嗎?我在本地運行應用程序,但在同一時間段內沒有出現同樣的問題。我認爲這可能是因爲我只有1個連接,因爲生產應用程序有很多。生產應用程序有許多'TP-Processor'線程,而我測試的本地線程只有一對。這可能是相關的嗎?謝謝。 – skaz

1

根據您對Quartz的使用情況,它可能與持久性和線程本地的a know memory leak with the Quartz plugin直接相關。你可能想仔細檢查一下,看看這是否適用於你的情況。

+0

感謝您對Quartz的這種洞察。這不是問題,但可能對未來有所幫助。 – skaz