web-dev-qa-db-ja.com

Java GCコンセプト:CMSInitiatingOccupancyFraction

以下のメモリオプションを設定しています:

export MEM_OPTS = "-Xmx2560m -Xms2560m -XX:NewSize = 786m -XX:MaxNewSize = 786m -XX:+ UseTLAB -XX:MaxPermSize = 512m"

GCパラメータは次のとおりです。

export GC1_OPTS = "-XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC -XX:CMSInitiatingOccupancyFraction = 5 -XX:+ CMSPermGenSweepingEnabled -XX:+ CMSClassUnloadingEnabled -XX:+ CMSParallelRemarkEnabled -XX:+ UseAdaptiveGCBound = "-XX:+ ExplicitGCInvokesConcurrent"

CMSがいつ実行されるか知りたいのですが、2560 MBの50%の後で実行されますか、それとも512 MBのメモリの50%の後で実行されますか。

コンセプトは何ですか?

私の合計ヒープメモリは= 2560 + 786 + 512 MB ....でしょ?または「-XX:NewSize = 786m-XX:MaxNewSize = 786m」は非ヒープの場合です。概念を説明してください。

13
VJS

どちらでもない。古い世代の占有率が50%に達した後、実行する資格があります。ここで、古い世代のサイズは、ヒープのサイズから新しい世代のサイズを引いたものです:2560m-786m = 1792m、つまり、古い世代は896mに達します。しかし、それが常に唯一のパラメータであるとは限りません。 -XX:+ UseCMSInitiatingOccupancyOnlyを唯一のパラメーターにしたい場合は、-XX:+ UseCMSInitiatingOccupancyOnlyを追加することをお勧めします(私の経験では、CMSは実際にはしきい値でトリガーされますが、それがなくても)。

要約する:

  • -Xmxは合計ヒープメモリです
  • -XX:NewSize/-XX:MaxNewSizeはそのヒープ内の新世代のサイズの範囲です
  • 違いは旧世代のサイズの範囲です
  • -XX:PermSize/-XX:MaxPermSizeは、非ヒープメモリである永続世代のサイズの範囲です。
27
Frank Pavageau