2011-01-07 45 views
2

我注意到我在Tomcat 5上運行的應用程序從1g內存開始,一旦它開始接收來自客戶端的請求,內存就開始下降,直到它下降到100MBs並且從那裏開始出現問題。我正在查看JVM部分中的「Tomcat」的/ manager/status頁面,其中列出了「Free Memory」,「Total Memory」,「Max Memory」。Tomcat內存問題

這是內存泄漏的一個指標嗎?即使沒有來自客戶機的請求,內存似乎也不會自動釋放。

+2

你是什麼意思,「內存開始下降」? – skaffman 2011-01-07 19:58:27

+0

與mem有關的選項是否與tomcat啓動? – hvgotcodes 2011-01-07 20:20:38

回答

0

啓用JMX on your tomcat並使用一些分析器監控它。像Jconsole或visualvm一樣。如果趨勢表明堆使用率在一段時間內快速增加,則可能會發生內存泄漏。檢查已加載的類,你可能能夠找出導致這個問題的原因。

此外,您的問題還不夠清楚。 「內存下降」是什麼意思?你的意思是空閒內存減少?

0

你在做靜態塊中的某些東西而不使用這些對象嗎? 如果您剛剛啓動服務器,將會運行一段時間,然後啓動瀏覽器會發生什麼?如果有未使用的對象,並且GC運行的內存應該增加。這可能無法解決您的問題,但可以縮小範圍。

0

與其檢查您的代碼尋找標準泄漏模式,最好的辦法是打開GC日誌記錄,然後運行像HP Jmeter這樣的工具對付這些日誌。

你可以找到關於如何使用JMeter的說明這裏:http://www.javaperformancetuning.com/tools/hpjmeter/index.shtml#howto

一個常見的模式看分析的GC日誌時是一個對象,它生活在多代。在一個正常的(非泄漏的)java程序中,你會發現對象不是短命就是長壽命,這意味着它們被快速創建和銷燬,或者它們在應用程序期間存在。如果一個物體短暫存在,它將只存在一小段穩定的世代。如果一個對象長期存在,它的年齡會隨着程序的運行而增加。但它只會屬於有限的幾代人。如果您發現一個對象具有多個具有不同年齡和增加的世代計數的實例,那麼很可能是對象正在泄漏。對於一個稍微好一點的解釋,看看這個演示文稿:http://www.hjug.org/present/Sporar-MemoryLeaks.pdf

一旦你確定了泄漏對象,下一步就是分析堆以查看誰持有對泄漏對象的引用。從那裏問題應該很容易確定