2010-10-16 25 views
4

在JDK 1.6中:我看到完整的GC已經運行,但老一代和perm gen空間沒有完全使用 - 問題與我的理解一樣FGC只在舊gen或perm gen已滿 - 我無法理解即使使用率很低,爲什麼它仍然運行?完整的GC - Sun JVM運行頻率

參見jstat的輸出-gcutil下面:

 
    S0  S1  E  O  P  YGC  YGCT FGC FGCT  GCT 
0.00 82.14 51.17 13.78 26.43 219 19.347  1 0.131 19.479 

    S0  S1  E  O  P  YGC  YGCT FGC FGCT  GCT 
82.14 0.00 9.12 13.92 26.66 222 19.771  1 0.131 19.902 

    S0  S1  E  O  P  YGC  YGCT FGC FGCT  GCT 
82.14 0.00 11.07 9.07 24.15 230 20.166  2 1.851 22.017 

我的最小/最大堆是1024M和最小和最大的PermGen空間被定義爲768M。

+0

一個可能的原因可能是RMI:「RMI強制定期完全收集,這些收集的頻率可以通過properties.java -Dsun.rmi.dgc.client.gcInterval和 -Dsun.rmi.dgc.server來控制。 gcInterval「http://java.sun.com/docs/hotspot/gc1.4.2/ – Anna 2010-10-19 04:23:38

回答

0

FGC只有當老根或燙髮根是充分

這不是真的運行。閱讀java參考文件here

Java中的內存管理可能讓所有人感到驚訝。學習如何爲非平凡應用程序設置JVM參數需要很多年。

permGen空間被定義爲768M。 XX:-DisableExplicitGC

通過將JVM選擇採用它減少到128M

+0

無法降低perm gen空間 - 因爲我們的應用程序大量使用它......使用高價值對它有什麼不利之處? – Anna 2010-10-18 10:44:47

+0

爲什麼你的應用程序會消耗燙髮嗎?你使用DOM XML解析器或比較多個字符串調用實習生? – iddqd 2010-10-18 10:53:25

+0

從你引用的pdf鏈接中可以看出:「當年輕一代填滿時,就會進行一代年輕一代的收藏(有時也稱爲次要收藏),當舊的或永久的一代填滿時,完整的 集合(有時稱爲主要集合)通常是完成的「。那些舊/燙髮器沒有裝滿而GC已經完成的情況是什麼? – Anna 2010-10-18 10:55:50

1

我解決了問題。

某些外部jar文件中的某些代碼可能已明確調用System.gc,從而導致垃圾收集行爲。禁用這些,導致垃圾收集在100%使用即將達到時的預期行爲。

1

完全切換gc到現在完全gc發生。因爲即使對於主要/終身收藏品,jstat也顯示FGC活動

For more info visit