2011-03-20 71 views
1

我正在寫一個Java應用程序大量的時間(這是監視磁盤上的一些文件,並根據變化的東西寫入到數據庫),但我注意到它花費在垃圾收集相當長的時間。我的日誌文件的一個片段在下面;關於垃圾收集花費的每一分鐘,這是應用程序不應該做的太多。我公司推出的Java與Java的花費在垃圾收集

java -Xmx1024m -Xms256m -verbose:gc -jar myApplication.jar 

和日誌文件給出

19:38:15 pong 
[Full GC 905059K->593250K(1013632K), 0.9315089 secs] 
19:38:28 pong 
... 
19:39:34 pong 
[Full GC 864134K->595982K(1013632K), 0.9592708 secs] 
19:39:47 pong 
.... 
19:40:36 pong 
[Full GC 875598K->623414K(1013632K), 1.2895245 secs] 
19:40:39 pong 

我大概可以切換到一個更好的垃圾收集器,它不會暫停我的計劃,但我更好奇,爲什麼它花費這麼多時間收集。編輯:我只得到主要的垃圾收集,我沒有看到小的收集。

什麼是調試的最佳方式?

+6

「這是在應用程序不應該做非常」 - 這可能是爲什麼發生的GC然後.... – 2011-03-20 12:42:54

+0

但後來它不應該是能夠從900 MB減少到600 MB,右? – 2011-03-20 12:44:21

+1

沒有看到你的代碼,我不知道。 – 2011-03-20 12:45:27

回答

3

我建議你使用一個內存分析器。

看樣子你有大量的靜態存儲器,600 MB。完整的集合可能是創建大量對象的結果(太多以至於不適合存活空間)如果使用內存分析器,它應該更明顯。

簡單的東西你可以做的是嘗試和提高年輕一代的空間。例如-ms800m -mx1200m -XX:NewSize = 500m。這可能會改變行爲並簡化應用程序分析。

+1

事實上,減少年輕一代解決了這個問題;我現在正在使用-XX:NewRatio = 4,現在所有舊的東西都很適合「老一代」 - 看起來所有將要永遠生活的東西對於老一代來說太大了,JVM試圖GC始終如一。 – 2011-03-21 18:38:42