2011-07-13 76 views
2

嗨我正在開發基於Web的Java工具。我們在兩臺獨立的服務器上部署了兩個我們的工具實例 - 一個在生產中(由許多客戶同時使用)和一個在我很少使用的開發環境中。這兩個實例,開發和生產,部署在具有相同硬件規格的完全等效的服務器中,具有確切的代碼,堆大小大小,應用服務器,版本等。生產中的性能問題

但是我觀察到生產實例中的緩慢即使在客戶使用量爲零的夜晚的奇怪小時開發實例(我們有工具來監控客戶在生產中的使用情況)。這是令人驚訝的,因爲所有因素都是相同的。我假設由於生產實例被高度使用,堆中的堆幾乎是完整的和碎片化的,而堆中的堆相對自由且沒有碎片。這就是爲什麼開發實例要快得多,即使一切都一樣。這是否是一個合理的假設,因爲碎片化的幾乎完整的堆將花費更多時間來創建對象,從而降低性能?

+0

此模式可能有助於http://www.rationaljava.com/2015/02/how-to-detect-and-diagnose-slow-code-in.html – Dan

回答

0

爲什麼假定堆是分散的?您可以使用VisualGc,Visual VM的插件實時分析GC統計信息。您可以將其中一臺生產服務器停止運行並對其進行配置。

http://java.sun.com/performance/jvmstat/visualgc.html

有很多因素在分析中考慮。延遲,網絡/磁盤IO,數據庫記錄及其大小+索引等等等等。

5

大多數GC執行復制和壓縮,避免任何碎片。只有併發標記掃描可以得到一些碎片,但在大多數情況下這不應該成爲問題。

而不是猜測你的問題可能是什麼我建議你測量系統正在做什麼。理想情況下,您想分析您的生產系統。例如在夜間或在低負荷下。例如VisualVM(免費)或YourKit(更好,不是免費的!)如果這不是一個選項,您可以監控其內存使用情況以及花費在GCing上的時間。例如與jstat

但是,如果你還沒有分析你的應用程序,我建議你這樣做,因爲可能會有一些明顯而簡單的事情可以做,以提高性能,即使你在開發上合理運行它現實的工作量。

你確定你的服務器沒有被網絡掃描儀掃描嗎? (他們傾向於不睡覺,並且可以在白天/夜晚的任何時間活動)

+0

YourKit有一個免費的10天評估。這非常非常容易使用 –

+0

YourKit比VisualVM的優勢之一就是它不使用Java進行監控。即不會出現最大的CPU /內存負載是VisualVM本身的問題。 –