Java 8.でPermGenをMetaSpaceに置き換えたことは知っています。
-XX:+CMSClassUnloadingEnabled
のような引数を追加することでGC収集されますが、PermGenよりもMetaSpaceが優れているのは何ですか?OutOfMemoryException
を取得します。前もって感謝します
MetaSpaceはデフォルトでGCが収集されますか?
はい、GCはいっぱいになるとメタスペースで実行され、メタデータに割り当てられたメモリを動的に増加させます(許可されている場合)。
PermGenでさえ、-XX:+ CMSClassUnloadingEnabledのような引数を追加することでGCが収集されますが、MetaSpaceがPermGenより優れているのはなぜですか?
改善は、permgenが実行できなかったメタスペースの動的な拡張によるものです。
MetaSpaceはネイティブメモリに基づいているため、VMではなくディスク上にJavaオブジェクトを保持しますか?
メタスペースの説明に基づいて、ネイティブメモリのみを使用します(ページングは行いません)。
Pierre-Hugues Charbonneau( link here )の調査に基づいて、メタスペースの導入は必ずしもOOM問題を解決するものではなく、せいぜい問題の絆創膏であり、動的に試みますメタスペースメモリのサイズを変更して、(ネイティブメモリで許可されている限り)制御不能に成長する可能性のある副作用でロードされるクラスの数に対応します。
MaxMetaspaceSize
引数をJVMに設定し、提供されているサンプルプログラムを実行することで、有名なOOMエラーを実現できます。
pierre-Hugues Charbonneauに感謝します。
に応じて:
デフォルトでは、メタスペースメモリがMaxMetaspaceSizeに達すると収集されます。このパラメーターは、最初は無制限です。制限は、マシンのメモリです。ただし、クラスとクラスローダーが不要になると、メモリは自動的に解放されます。 ClassLoaderにメモリリークがあると疑われる場合にのみ、このパラメータを調整する必要があります。
MetaSpeceはネイティブメモリを使用し、ポインタを使用したメモリの構成により、GCは古いPermGenメモリよりも高速になります。
いいえ、それはJVMが一般的なCプログラムのようなメモリを使用し、Javaオブジェクトに仮想メモリ空間を使用しないことを意味します。メモリはマシンによってのみ制限されるようです。必要に応じて、マシンのメモリをディスクにスワップできること。
パラメーターMaxMetaspaceSizeを設定するとOutOfMemoryを取得でき、このパラメーターを設定しないと、プロセスがすべてのマシンメモリ(スワップ領域を含む)を割り当てる場合に取得できます。
MetaSpaceはデフォルトでGCが収集されますか?
デッドクラスとクラスローダーのガベージコレクションは、クラスメタデータの使用量が「MaxMetaspaceSize」(デフォルトでは"unlimited"
そのため、このようなGCの遅延または頻度を制限するには、適切な監視が必要です。
PermGenでさえ、-XX:+ CMSClassUnloadingEnabledなどの引数を追加することでGCが収集されますが、MetaSpaceがPermGenより優れているのはなぜですか?
主な目標は、permgenを削除することでした。これにより、ユーザーは正しいサイズを検討する必要がなくなりました。
MetaSpaceはネイティブメモリに基づいているため、VMではなくディスク上にJavaオブジェクトを保持しますか?
ディスクはネイティブメモリではなく、ストレージデバイスです。ネイティブメモリは、このコンテキストでは、エリアであり、Javaヒープから残ったプロセスのメモリです。
MetaSpaceでさえメモリ不足になりますか?
はい、マシンのメモリ量によって制限されます。