MetaSpace OOM をシミュレートするプログラムを作成しました。MetaSpace Size
しかし、ほとんどの場合、 の 2 倍の大きさであることがわかりましたUsed MetaSpace
。なんで?
flag を指定してプログラムを実行すると、プログラムは 50M ではなく約 25M-XX:MaxMetaspaceSize=50m
に達すると OOM をスローします。なぜですか?Used MetaSpace
MetaSpace OOM をシミュレートするプログラムを作成しました。MetaSpace Size
しかし、ほとんどの場合、 の 2 倍の大きさであることがわかりましたUsed MetaSpace
。なんで?
flag を指定してプログラムを実行すると、プログラムは 50M ではなく約 25M-XX:MaxMetaspaceSize=50m
に達すると OOM をスローします。なぜですか?Used MetaSpace
次の 2 つの実験は、MetaSpace SizeとUsed MetaSpaceの間のギャップが何を意味するかを説明すると思います。
EXP-1 : ClassLoader ごとに 1 つのクラスをロードすると、次のようになります。
EXP-2 : ClassLoader ごとに 5 つのクラスをロードすると、次のようになりました。
Java 8 ドキュメントにあるように:
スペースは OS から要求され、チャンクに分割されます。クラスローダーは、そのチャンクからメタデータ用のスペースを割り当てます (チャンクは特定のクラスローダーにバインドされます)。
通常、チャンクには複数のクラスを含めることができるため、ClassLoader ごとにロードするクラスが増えるほど、MetaSpace Size の使用率が高くなるということだと思います。
次のコマンドを使用してコードを実行すると、結果を再表示できます。
java -XX:MaxMetaspaceSize=50m MetadataOOMSimulator 100000000
注意: ロードするすべてのクラスがCLASSPATH
(通常は現在のディレクトリを含む) に表示されないようにしてください。そうしないと、それらのクラスがカスタマイズされた ClassLoader ではなく APPClassLoader によってロードされます。