Java 8ヒープのプリントアウトでは、次のような行が表示される場合があります。
メタスペース使用済み2425K、容量4498K、コミット済み4864K、予約済み1056768K
https://docs.Oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html 行を説明しようとします:
Metaspaceで始まる行で、used値は、ロードされたクラスに使用されるスペースの量です。 capacity値は、現在割り当てられているチャンクのメタデータに使用できるスペースです。 committed値は、チャンクに使用可能なスペースの量です。 reserved値は、メタデータ用に予約されている(ただし必ずしもコミットされていない)スペースの量です。
繰り返しますが、上記のリンクから:
スペースはOSから要求され、チャンクに分割されます。クラスローダーは、そのチャンクからメタデータ用のスペースを割り当てます(チャンクは特定のクラスローダーにバインドされます)。
各フィールドの意味(使用済み、容量、コミット済み、予約済み)を知りたいのですが、上記の定義を理解するのに苦労しています。
私の理解では、メタスペースはJVMプロセスの仮想アドレス空間から切り出されています。 JVMは、-XX:MetaspaceSizeに基づいて起動時に初期サイズを予約します。これには、文書化されていないプラットフォーム固有のデフォルトがあります。 reservedはメタスペースの合計サイズを指していると思います。スペースはチャンクに分割されます。各チャンクのサイズが同じかどうかはわかりません。各チャンクには、単一のクラスローダーに関連付けられたクラスメタデータが含まれています。
Capacityおよびcommittedは、私には空き領域のように聞こえます(定義に基づく)リンクから)。メタデータはチャンク内に格納されているため、使用済み+容量はコミット済みと等しいと思いますが、そうではありません。おそらくコミットとは、使用される予約済みスペースを意味しますが、使用されるとはどういう意味ですか?メタデータで使用される使用済みスペース?それでは、スペースを使用する他の方法はありますか?
私の混乱をご覧いただければ幸いです。定義を明確にしていただければ幸いです。
メタスペースは、1つ以上の仮想スペースで構成されます。仮想空間は、OSから取得した連続したアドレス空間の領域です。それらはオンデマンドで割り当てられます。割り当てられると、仮想スペースはOSからメモリを予約しますが、まだコミットしていません。メタスペース予約済みメモリは、すべての仮想スペースの合計サイズです。
仮想空間内のアロケーションユニットはメタチャンク(または単にチャンク)です。仮想スペースから新しいチャンクが割り当てられると、対応するメモリはコミットされます。メタスペースcommittedメモリは、すべてのチャンクの合計サイズです。
チャンクはサイズが異なる場合があります。 ClassLoaderがガベージコレクションを取得すると、それに属するすべてのMetachunkが解放されます。フリーチャンクは、グローバルフリーリストに保持されます。 Metaspacecapacityは、すべての割り当てられた(つまり空きではない)チャンクの合計サイズです。
新しいチャンク割り当て
クラスメタデータはチャンク内に割り当てられます。チャンクには複数のClassLoaderからのデータが含まれていない場合がありますが、1つのClassLoaderに複数のチャンクが含まれている場合があります。メタスペースusedは、すべてのチャンクからのすべてのクラスメタデータの合計サイズです。