Java 7までは、JVM がクラスを保持するために使用していたPermGenと呼ばれる領域がJVMメモリにありました。Java 8、それを除去し、と呼ばれる領域に置き換えメタスペース。
PermGenとメタスペースの最も重要な違いは何ですか?
私が知っている唯一の違いは、java.lang.OutOfMemoryError: PermGen space
もうスローできず、VMパラメータMaxPermSize
が無視されることです。
Java 7までは、JVM がクラスを保持するために使用していたPermGenと呼ばれる領域がJVMメモリにありました。Java 8、それを除去し、と呼ばれる領域に置き換えメタスペース。
PermGenとメタスペースの最も重要な違いは何ですか?
私が知っている唯一の違いは、java.lang.OutOfMemoryError: PermGen space
もうスローできず、VMパラメータMaxPermSize
が無視されることです。
回答:
ユーザーの観点からの主な違い-前の回答では十分に強調されていないと思います- メタスペースはデフォルトで自動的にサイズを(基盤となるOSが提供するものまで)増やしますが、PermGenは常に最大サイズを固定しています。JVMパラメータを使用してメタスペースの固定最大値を設定できますが、PermGenを自動増加させることはできません。
大体それは単なる名前の変更です。これ-戻るPermGenを導入した場合、一切のJava EEまたは動的クラス(UN)のロード、クラスがロードされた後、JVMがシャットダウンするまで、それがメモリ内に立ち往生してなかった常設生成が。現在、クラスはJVMの存続期間中にロードおよびアンロードされる可能性があるため、メタスペースは、メタデータが保持される領域にとってより意味があります。
どちらにもjava.lang.Class
インスタンスが含まれており、どちらもClassLoaderリークの影響を受けます。唯一の違いは、メタスペースのデフォルト設定では、症状に気づくまでに時間がかかるということです(自動で可能な限り大きくなるため)。つまり、解決せずに問題をさらに先に進めるだけです。OTOH OSメモリが不足した場合の影響は、JVM PermGenが不足した場合よりも深刻になる可能性があると思います。
JVMをPermGenとメタスペースのどちらで使用していても、動的なクラスのアンロードを実行している場合は、たとえば、ClassLoader Leak Preventionライブラリを使用するなどして、クラスローダーのリークに対する対策を講じる必要があります。
さようなら、さようならPermGen、こんにちはメタスペース
PermGenは完全に削除されました。
メタスペースガベージコレクション -クラスのメタデータの使用量がに達すると、デッドクラスとクラスローダーのガベージコレクションがトリガーされMaxMetaspaceSize
ます。
Metadata
保持されていたスペースはに隣接しなくなりJava heap
、metadata
はネイティブメモリからと呼ばれる領域に移動しましたMetaspace
。
簡単な言葉で、
クラスメタデータはネイティブメモリから割り当てられるため、利用可能な最大領域は利用可能なシステムメモリの合計です。したがって、もはや遭遇することはなく、OOM errors
最終的にスワップスペースにこぼれる可能性があります。
の削除はPermGen
、クラスローダーのリークの問題がなくなったことを意味しません。したがって、はい、リークは最終的にネイティブメモリ全体を消費するため、消費量を監視し、それに応じて計画する必要があります。