2012-04-06 74 views
10

我有一個應用程序負責歸檔舊的應用程序,它將一次執行大量的應用程序,因此它需要一次運行數天。應該花多少時間做垃圾回收

當我的公司開發它時,他們做了一些公正的性能測試,他們似乎從中得到了不錯的數據,但我最近爲一位客戶運行了一個存檔,而且它似乎運行速度非常慢,表現似乎正在退化甚至更長的時間。

似乎沒有內存泄漏,因爲我使用jconsole監視它,但仍有大量內存可用,並且看起來並沒有縮小。

但我已經注意到,堆的倖存者空間和終身代可以很快填滿,直到垃圾收集出現,並清除它似乎很頻繁發生,我不知道如果這可能是一個明顯減緩的來源。

該應用程序已運行7天3小時,根據jconsole,它已花費6小時執行復制垃圾回收(772,611集合)以及12小時25分鐘的markweep壓縮(145,940集合)。

這似乎是一個大量的時間花在垃圾回收上,我只是想知道是否有人看過類似的東西,並知道這是否正常?

編輯

本地處理似乎是緩慢的,比如我在看日誌中的一部分是用了5秒內使用的XPath它然後追加到一個字符串提取SOAP信封一些XML緩衝區以及根標籤......就是這樣。我還沒有對它進行簡介,因爲這是在生產環境中運行,我要麼通過網絡將數據拉下來,要麼在我們的開發環境中建立一個可能最終需要做的大型測試基地。

運行Java HotSpot客戶端虛擬機版本10.0-B23

真的只需要高吞吐量,還沒有配置任何特定的垃圾收集參數,將永遠運行在默認設置是什麼。不知道如何找到什麼收藏家將被使用?

修復

最終得到一個事件探查器就可以了,轉身出了放緩的原因是一些代碼,不斷修剪線斷狀態框輸出這是很嚴重的做記錄的聲明。應該認識到垃圾收集是不斷將狀態文本複製到內存中的症狀,而不是真正的原因。

乾杯人。

+0

無論法官下令做什麼? – ZenMaster 2012-04-06 01:00:42

+0

*(不是你的問題的回答,因此評論)* ... *「這將一次做大量的應用程序,所以它將需要一次運行幾天。」* ... [原文如此]你的意思是你的應用程序無法關閉並重新啓動,無需從頭開始一切!? – TacticalCoder 2012-04-06 01:06:18

+0

那麼,如果你停下來,它會保存一個列表,列出哪些應用程序沒有存檔,哪些可以加載並重新運行。如果我們不能在接下來的幾天內加快速度,將我們的檔案標誌分成更小的批次,那就是我們的計劃。 – Dan675 2012-04-06 01:11:39

回答

4

根據你的數字,在7天的執行時間內垃圾收集總時間約爲18小時。在總執行時間的10%左右,這個數字略有提高,但即使您設法將其降至0%,您也只能節省10%的執行時間......所以,如果您想要大量節省,您應該更好地研究其他90%,例如使用Profiler。

2

沒有適當的分析,這是一個猜謎遊戲。儘管如此,幾年前,我參與的一個Web應用程序在JDK升級後突然減慢了(響應時間)10倍。我們最終追查到一位已經不在公司的Genious加入的明確的GC調用。

2

您將嘗試在JVM堆佔用空間和GC時間之間保持平衡。另一個問題可能是你有堆(和世代)(under-)以這種方式分配頻繁GCing的方式。在這些系統上部署多租戶JVM時,我試圖將總平衡時間保持在5%以下,同時積極縮小堆以減少佔用空間(同樣是多租戶)。堆和世代將主要填補以避免頻繁GCing到任何設置。刪除-Xms參數以查看更真實的穩定狀態(如果它有任何空閒時間)

+1對建議雖然分析;它可能與GC不相關,但代碼。