2012-02-07 43 views
3

最近試圖增加堆空間和新舊gen大小的比例,我看到來自jstat -gccapacity的混淆結果,它顯示的容量比我預期的要小得多。在調整JVM堆大小後解釋jstat輸出

JVM(1.5.0_16)以-server -Xms2048m -Xmx2048m -XX:NewRatio=2開頭。它運行在Solaris 5.10 amd64主機上。大約10GB的可用內存。因此,從我讀過的內容來看,JVM應該能夠充分利用2GB的堆空間。

看着jstat -gcutil我觀察到所有填滿了幾次導致垃圾收集的世代。例如:

Timestamp   S0  S1  E  O  P  YGC  YGCT FGC FGCT  GCT 
     66150.4 0.00 51.09 56.95 90.33 54.85 6291 58.922  7 22.826 81.748 

我想過會導致JVM將所有代都擴展到它們的完整大小。然而,jstat -gccapacity生產:

NGCMN NGCMX  NGC  S0C S1C  EC  OGCMN  OGCMX  OGC   OC  PGCMN PGCMX  PGC  PC  YGC FGC 
700416.0 700416.0 86016.0 1408.0 1408.0 39104.0 1398784.0 1398784.0 1398784.0 1398784.0 16384.0 65536.0 38912.0 38912.0 6338  7 

隨後的運行中表現出的價值NGC/S0C/S1C/EC變化:

NGCMN NGCMX  NGC  S0C S1C  EC  OGCMN  OGCMX  OGC   OC  PGCMN PGCMX  PGC  PC  YGC FGC 
700416.0 700416.0 86016.0 1472.0 1472.0 39104.0 1398784.0 1398784.0 1398784.0 1398784.0 16384.0 65536.0 38912.0 38912.0 6380  7 
700416.0 700416.0 106496.0 1792.0 1856.0 97024.0 1398784.0 1398784.0 1398784.0 1398784.0 16384.0 65536.0 38912.0 38912.0 6433  7 
700416.0 700416.0 106496.0 1792.0 1792.0 96064.0 1398784.0 1398784.0 1398784.0 1398784.0 16384.0 65536.0 38912.0 38912.0 6436  7 

據我所知,容量數據,是生成和總規模利用率數字顯示了這代人的分配情況。因此,上述結果告訴我,新的gen min和max容量都是(NGCMN/MGCMX)684MB,舊的gen min和max是1366MB(OGCMN/OGCMX)。讓我感到困惑的是新一代的能力。所以我的問題:

  1. 爲什麼EC + S0C + S1C == NGC? (41,920!= 86016)
  2. 爲什麼NGC顯着小於NGCMN/MGCMX?
    • 這是因爲最大堆大小正在被打(這將把它放在1,488MB,來自NGC + OGC + PGC),如果是的話會導致下限?我能找到的所有文檔都說Solaris 64位JVM應該能夠使用4GB。
  3. 如果最大堆大小被擊中,爲什麼新一代的容量變化(全部增加或全部減少)而沒有老一代改變補償)。

其它潛在有用的jstat結果:

$ jstat -gcnew 20167 
S0C S1C S0U S1U TT MTT DSS  EC  EU  YGC  YGCT 
1536.0 1600.0 1300.3 0.0 13 15 1600.0 82880.0 30892.6 6482 60.540 

$ jstat -gcnewcapacity 20167 
    NGCMN  NGCMX  NGC  S0CMX  S0C  S1CMX  S1C  ECMX  EC  YGC FGC 
    700416.0 700416.0 106496.0 1472.0 233472.0 233472.0 1408.0 700288.0 81088.0 6489  7 

$ jstat -gcold 20167 
    PC  PU  OC   OU  YGC FGC FGCT  GCT 
38912.0 21426.5 1398784.0 1375651.6 6503  7 22.826 83.627 

$ jstat -gcoldcapacity 20167 
    OGCMN  OGCMX  OGC   OC  YGC FGC FGCT  GCT 
    1398784.0 1398784.0 1398784.0 1398784.0 6517  7 22.826 83.779 

$ jstat -gcpermcapacity 20167 
    PGCMN  PGCMX  PGC   PC  YGC FGC FGCT  GCT 
    16384.0 65536.0 38912.0 38912.0 6531  7 22.826 83.925 

回答

2

事實證明,這是故意行爲,通過吞吐量收集:

Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine > 5.2.2.2 Adjusting Generation Sizes

的統計數據(例如, ,平均暫停時間)由收藏家保存的是 在集合結束時更新。然後進行測試以確定 目標是否已經達到,並且對所述一代的尺寸進行任何所需的調整。

在JVM處於峯值負載下時觀察GC容量確實顯示組合的年輕gen電流容量等於最小/最大容量值。