web-dev-qa-db-ja.com

JVMヒーププリントアウトのメタスペース行を理解する

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は、私には空き領域のように聞こえます(定義に基づく)リンクから)。メタデータはチャンク内に格納されているため、使用済み+容量はコミット済みと等しいと思いますが、そうではありません。おそらくコミットとは、使用される予約済みスペースを意味しますが、使用されるとはどういう意味ですか?メタデータで使用される使用済みスペース?それでは、スペースを使用する他の方法はありますか?

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

18
J. Smith

Metaspace layout

メタスペースは、1つ以上の仮想スペースで構成されます。仮想空間は、OSから取得した連続したアドレス空間の領域です。それらはオンデマンドで割り当てられます。割り当てられると、仮想スペースはOSからメモリを予約しますが、まだコミットしていません。メタスペース予約済みメモリは、すべての仮想スペースの合計サイズです。

仮想空間内のアロケーションユニットはメタチャンク(または単にチャンク)です。仮想スペースから新しいチャンクが割り当てられると、対応するメモリはコミットされます。メタスペースcommittedメモリは、すべてのチャンクの合計サイズです。

チャンクはサイズが異なる場合があります。 ClassLoaderがガベージコレクションを取得すると、それに属するすべてのMetachunkが解放されます。フリーチャンクは、グローバルフリーリストに保持されます。 Metaspacecapacityは、すべての割り当てられた(つまり空きではない)チャンクの合計サイズです。

新しいチャンク割り当て

  1. フリーリストで既存のフリーチャンクを探します。
  2. 適切な空きチャンクがない場合は、現在の仮想スペースから新しいチャンクを割り当てます。
  3. 現在の仮想スペースが使い果たされた場合は、新しい仮想スペースを予約してください。

クラスメタデータはチャンク内に割り当てられます。チャンクには複数のClassLoaderからのデータが含まれていない場合がありますが、1つのClassLoaderに複数のチャンクが含まれている場合があります。メタスペースusedは、すべてのチャンクからのすべてのクラスメタデータの合計サイズです。

38
apangin