3

最近、ヒープスペースと新世代と旧世代のサイズの比率を増やすことを試みましたが、jstat -gccapacity予想よりもはるかに小さい容量を示しているという紛らわしい結果が見られます。

JVM(1.5.0_16)は。で開始され-server -Xms2048m -Xmx2048m -XX:NewRatio=2ます。Solaris5.10amd64ホストで実行されています。約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

私の理解では、容量の数値は世代の合計サイズであり、使用率の数値は世代内の割り当てを示しています。したがって、上記の結果は、新しい世代の最小容量と最大容量の合計が両方とも(NGCMN / MGCMX)684MBであり、古い世代の最小容量と最大容量が1,366MB(OGCMN / OGCMX)であることを示しています。私を混乱させているのは、新世代の能力です。だから私の質問:

  1. EC + S0C + S1C == NGCではないのはなぜですか?(41,920!= 86016)
  2. NGCがNGCMN/MGCMXよりも大幅に小さいのはなぜですか?
    • これは、最大ヒープサイズ(NGC + OGC + PGCから1,488MBになります)に達したためですか?もしそうなら、下限の原因は何ですか?私が見つけることができるすべてのドキュメントは、Solaris64ビット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
4

1 に答える 1

2

これは、スループットコレクターによる意図的な動作であることがわかります。

5.0Java[tm]仮想マシンを使用したガベージコレクションの調整>5.2.2.2生成サイズの調整

コレクターによって保持される統計(たとえば、平均休止時間)は、コレクションの最後に更新されます。次に、目標が達成されたかどうかを判断するためのテストが行​​われ、世代のサイズに必要な調整が行われます。

JVMにピーク負荷がかかっているときにGC容量を観察すると、若い世代の現在の容量の合計が最小/最大容量値に等しいことがわかります。

于 2012-02-09T05:46:03.513 に答える