2013-07-09 38 views
0

我開始一個Java程序:爲什麼有完整的GC?

java -cp -Xms6072m -Xmx6072m -Xmn2048m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:-DisableExplicitGC 

但也有太多的全部GC?

2013-07-09T18:16:42.215+0800: [Full GC [PSYoungGen: 11987K->0K(1972032K)] [PSOldGen: 333076K->150949K(408768K)] 345063K->150949K(2380800K) [PSPermGen: 44430K->44430K(262144K)], 0.4696770 secs] [Times: user=0.47 sys=0.00, real=0.47 secs] 

2013-07-09T18:16:58.696+0800: [Full GC [PSYoungGen: 12357K->0K(2029568K)] [PSOldGen: 386748K->118215K(383232K)] 399105K->118215K(2412800K) [PSPermGen: 44430K->44430K(262144K)], 0.5117670 secs] [Times: user=0.51 sys=0.00, real=0.51 secs] 

我不知道爲什麼!任何人都可以幫助我?

+2

兩個完整的GC相隔16秒是「太多」了嗎? –

+0

嘗試-XX:MaxPermSize = 512m或更高 –

+0

嘗試'-Xmx * highvalue *',也請閱讀[this](http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523) .html) – NINCOMPOOP

回答

1

根據您選擇的垃圾收集器,垃圾收集不僅發生在內存已滿時。他們可以由各種事件/州觸發。不知何故,Garbace Collector認爲這是開始運行垃圾回收的合適時機。

試着找出你正在使用的垃圾回收器的特性。防止垃圾收集可能非常棘手,沒有任何進一步的信息很難給出任何建議。很少情況下,垃圾收集是任何問題的真正原因。通常垃圾收集在實時應用程序中非常重要。它在最後輸出的時間的半秒很可能是整個垃圾收集所花費的時間。通常只有一小部分是應用程序暫停的時間。

1

我不知道什麼是「太多」的意思,但我相信這樣的意圖:

-XX:-DisableExplicitGC

是禁用顯式垃圾收集,即調用System.gc ()或Runtime.getRuntime()。gc()。如果是這樣的意圖,減號是錯誤的,它應該是:

-XX:+ DisableExplicitGC

1

根據你的命令行,你堆的幾何形狀:

  • 舊空間:4吉布
  • 楊空間:2吉布(1.5吉布伊甸+ 0.5 2GB的倖存者中,如果缺省比值適用)

根據你的GC日誌中,當第一完整GC正在發生

  • 舊空間具有3.3吉布(4 GIB)
  • 年輕空間1.1吉布(2 GIB)

當JVM啓動年輕GC,它必須確保它有足夠的可用空間在舊的容納促進對象。

不幸的是,你沒有包含小的GC記錄,所以我必須進一步推測。

JVM看到數據的1.1 2GB的年輕空間,只有約0.7吉布的舊空間的自由空間,所以在容納推廣對象也可能沒有足夠的自由空間。這可能是啓動完整GC的原因。

但是爲什麼年輕的GC在這個時候觸發了,如果伊甸園有足夠的空間?
下面是幾個可能的原因:

  • 自適應大小的政策可能會推卸伊甸園(1。5吉布到〜1GiB)
  • 分配大陣可能引發年輕GC(成爲全GC)

同時請注意,-XX:-DisableExplicitGC標誌沒有作用(減而不是加號),所以這一切的怪異行爲可能由System.gc()