1. ホーム
  2. java

[解決済み] JVMフラグCMSClassUnloadingEnabledは、実際に何をするのですか?

2022-03-04 05:57:11

質問

Java VMのフラグが何なのか、どうしても定義が見つかりません。 CMSClassUnloadingEnabled PermGenの問題を解決する"などの非常にあいまいな高レベルの定義以外に、実際に何をしているのか( それはない ということです。)

Sun/Oracleのサイトを見てみましたが、さらに オプションリスト は、実際に何をするものなのかが書かれていません。

フラグの名前から推測すると、CMSガーベジコレクタはデフォルトでクラスをアンロードしないので、このフラグでアンロードをオンにするのだろうと思います - しかし、確証はありません。

解決方法は?

更新情報 この回答はJava 5-7に関連するものです。Java 8ではこの問題は修正されています。 https://blogs.oracle.com/poonam/about-g1-garbage-collector,-permanent-generation-and-metaspace クドスはこちら マウント・ウール

Java 5-7用です。

Oracle/Sun VMの標準的な考え方は、「クラスは永遠である」というものです。つまり、一度読み込まれたクラスは、誰も気にしなくなったとしても、ずっとメモリに残っているのです。これは通常、純粋にセットアップされたクラス(セットアップのために一度だけ使用され、その後は二度と使用されない)はそれほど多くないので問題ありません。つまり、たとえ1MBを占有していたとしても、誰も気にしないのです。

でも最近はGroovyのように、実行時にクラスを定義する言語も出てきていますよね。スクリプトを実行するたびに、1つ(またはそれ以上)の新しいクラスが作成され、それらは永久にPermGenにとどまる。サーバーを動かしているならば、それはメモリリークがあることを意味する。

を有効にすると CMSClassUnloadingEnabled GCはPermGenも掃引し、使われなくなったクラスを削除します。

[EDIT】です。] を有効にする必要があります。 UseConcMarkSweepGC (おかげさまで サム・ハスラー ). こちらの回答をご覧ください。 https://stackoverflow.com/a/3720052/2541