3

MetaSpace OOM をシミュレートするプログラムを作成しました。MetaSpace Sizeしかし、ほとんどの場合、 の 2 倍の大きさであることがわかりましたUsed MetaSpace。なんで?

flag を指定してプログラムを実行すると、プログラムは 50M ではなく約 25M-XX:MaxMetaspaceSize=50mに達すると OOM をスローします。なぜですか?Used MetaSpace

ここに画像の説明を入力

4

2 に答える 2

1

次の 2 つの実験は、MetaSpace SizeUsed MetaSpaceの間のギャップが何を意味するかを説明すると思います。

EXP-1 : ClassLoader ごとに 1 つのクラスをロードすると、次のようになります。 ここに画像の説明を入力

EXP-2 : ClassLoader ごとに 5 つのクラスをロードすると、次のようになりました。 ここに画像の説明を入力

Java 8 ドキュメントにあるように:

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

通常、チャンクには複数のクラスを含めることができるため、ClassLoader ごとにロードするクラスが増えるほど、MetaSpace Size の使用率が高くなるということだと思います。

次のコマンドを使用してコードを実行すると、結果を再表示できます。

java -XX:MaxMetaspaceSize=50m MetadataOOMSimulator 100000000

注意: ロードするすべてのクラスがCLASSPATH(通常は現在のディレクトリを含む) に表示されないようにしてください。そうしないと、それらのクラスがカスタマイズされた ClassLoader ではなく APPClassLoader によってロードされます。

于 2016-08-23T09:10:52.217 に答える