2010-11-04 26 views
10

目前我面臨的問題是我的應用程序偶爾會顯示很長的GC時間,但所有這些只是由弱參考處理引起的。所以線程停止時間總是接近弱引用處理時間。所有其他GC循環爲0.0001秒至0.200秒。如何在GC期間降低微弱的參考處理時間?

從gc.log(格式化):

10388.186: [GC[YG occupancy: 206547 K (306688 K)]10388.186: [Rescan (parallel) , 
0.1095860 secs]10388.295: [weak refs processing, 2.0799570 secs] 
[1 CMS-remark: 2973838K(3853568K)] 3180386K(4160256K), 2.1899230 secs] 
[Times: user=2.51 sys=0.00, real=2.18 secs] 
Total time for which application threads were stopped: 2.1906890 seconds 

目前我在的地方這些設置。試過簡單的設置,但沒有改變。

-Xms4g 
-Xmx4g 
-XX:NewSize=128m 
-XX:+UseConcMarkSweepGC 
-XX:+CMSIncrementalMode 
-XX:MaxGCPauseMillis=50 
-XX:CMSInitiatingOccupancyFraction=50 
-XX:ParallelGCThreads=16 
-XX:+DisableExplicitGC 

如果我打開NewSize,最終得到長的正常GC週期。該機器有8個內核,並且不會爲應用程序燒盡多少cpu。試着早點和同時開始運行舊gen GC。

是的,我無法擺脫弱ref參數,因爲這是第三方庫的一部分。

回答

7

我在「hotspot-gc-use」郵件列表中找到了this message

總之,嘗試-XX:+ParallelRefProcEnabled開關。


UPDATE

我發現喬恩正光的Weblog更好的解釋:在低暫停集電極

6)並行參考處理。

對於廣泛使用Reference對象的應用程序,處理Reference對象的GC工作可能很明顯。它在低停頓收集器中並不一定比在其他收集器中更壞,但它會更多傷害(因爲我們試圖保持較低的停頓)。並行參考處理可用於低暫停收集器,但默認情況下未啓用。除非有大量參考對象,否則連續進行參考處理通常會更快。如果您廣泛使用Reference對象(大多數應用程序沒有),請將其打開並帶有標記-XX:+ParallelRefProcEnabled

+0

太好了。明天早上我會試試這個。 – ReneS 2010-11-04 22:15:54

+0

請注意正確的格式:-XX:+ ParallelRefProcEnabled – ReneS 2010-11-05 07:55:25

+0

幫助!現在的時間在0.2-0.5左右,似乎是可以預測的。真棒! – ReneS 2010-11-05 09:48:45