2013-06-26 53 views
1

我們有一個RESTful Web服務(Java,託管在Tomcat中)。它不時(不是每週)都失敗。當它失敗時,Java CPU消耗達到100%,並佔用所有可用內存。它本身並沒有完成。我必須重新啓動服務器。Tomcat訪問日誌 - 是否包含失敗的請求?

Tomcat訪問日誌中沒有任何可疑內容。我想我們的一個用戶可能會提交一個非常「沉重」的請求,導致服務器關閉。這個請求是否可能不在Tomcat日誌中,因爲它從未完成?

非常感謝

馬克西姆

回答

0

它更可能是你的Tomcat進程正在泄漏內存,直到它有沒有更多的可用內存。嘗試記錄每個請求的堆大小,然後注意它是否持續增長。

tomcat類加載器可能會泄漏內存,特別是如果您使用「自動部署」功能。

long freeMem=Runtime.getRuntime().freeMemory(); 
long maxMem=Runtime.getRuntime().maxMemory(); 
long totalMem=Runtime.getRuntime().totalMemory(); 

然後記錄freeMem/MaxMem和totalMem。如果max持續增長,你會得到泄漏。

編輯:並回答你的問題。這取決於tomcat如何失敗,以及如何設置日誌記錄。但與我們的系統(一個相當默認的apache mod_proxy => tomcat,有一些致命的tomcat錯誤,它們只記錄在catalina.out

+0

對不起,它突然發生,很少,我們使用NewRelic - 它顯示Java內存圖表沒有內存泄漏 –

+0

它仍然聽起來像內存泄漏,即使是最重的單個請求也不應該殺死tomcat,因爲有多個線程來處理其他請求,所以如果它是一個單一的請求,它會 – MTilsted

+0

NewRelic是否也顯示最大堆大小?因爲我們曾經有一個tomcat系統,最大堆保持增長,而應用程序使用的內存沒有增長,所以它會運行一個garbadge集合,這會使堆從700MB增加到800MB,然後在收集之後將有650MB空閒。所以沒有理由增長堆,但它一直到達最大堆大小並死亡。 – MTilsted