21

Java 8 ヒープの出力では、次のような行が表示される場合があります。

メタスペース 使用2425K、容量4498K、コミット4864K、予約1056768K

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.htmlは次の行を説明しようとします:

Metaspace で始まる行のused値は、ロードされたクラスに使用されるスペースの量です。容量の値は、現在割り当てられているチャンク内のメタデータに使用できるスペースです。コミットされた値は、チャンクに使用できるスペースの量です。予約済みの値は、メタデータ用に予約されている (必ずしもコミットされているとは限らない) スペースの量です。

繰り返しますが、上記のリンクから:

スペースは OS から要求され、チャンクに分割されます。クラスローダーは、そのチャンクからメタデータ用のスペースを割り当てます (チャンクは特定のクラスローダーにバインドされます)。

各フィールドの意味 (使用済み、容量、コミット済み、予約済み) を知りたいのですが、上記の定義を理解するのに苦労しています。

私の理解では、メタスペースは JVM プロセスの仮想アドレス空間から切り離されています。JVM は、-XX:MetaspaceSize に基づいて起動時に初期サイズを予約します。これには、文書化されていないプラットフォーム固有のデフォルトがあります。予約済みとは、メタスペースの合計サイズを指すと思います。スペースはチャンクに分割されます。各チャンクが同じサイズかどうかはわかりません。各チャンクには、1 つのクラス ローダーに関連付けられたクラス メタデータが含まれます。

容量コミットされた音は、私にとっては空き容量のように聞こえます (リンクの定義に基づく)。メタデータはチャンク内に保存されるため、使用済み + 容量はコミット済みと等しいと思いますが、そうではありません。コミットされたということは、使用される予約済みスペースを意味するかもしれませんが、使用されたということは何を意味するのでしょうか? メタデータによって使用される使用済みスペース? では、他にどんな使い方があるでしょうか。

私の混乱を理解していただければ幸いです。定義を明確にしていただければ幸いです。

4

1 に答える 1