12

PermGen スペースを減らすために、JVM が通常クラスをアンロードするかどうかを知りたいです。だからここに私の質問:

  1. Java クラスがデフォルトで JVM からアンロードされることはありますか?
  2. Jar クラスローダを閉じると、ロードされたすべてのクラスがその jar からアンロードされますか?
  3. クラスのアンロードを許可するには、どのコマンド/方法を使用する必要がありますか?

参考までに、Web でいくつかのソリューションを試しましたが、どれも私の質問に答えてくれませんでした。(例: JVM フラグ CMSClassUnloadingEnabled は実際に何をしますか? )

PS: Java 6 + hibernate について言及しています (クラスのロードは hibernate によって処理されます)。

4

4 に答える 4

3

ロードされたクラスを取り除く唯一の方法は、このクラス・ローダーへのすべての参照を除去することによって、これらのクラスをロードしたクラス・ローダーを JVM が GC できるようにすることです。これは、Web アプリケーションをアンデプロイするときに Web サーバーで発生することです。

于 2013-07-15T10:50:44.427 に答える
3

現在、永久世代はデフォルトで収集されています。

Permanent Generation は単一のスペースで構成されていますが、独自のコレクターはありません。代わりに、このスペースは旧世代の一部として収集されます。

このvisualgcページによると。

-XX:+CMSPermGenSweepingEnabled古い JVM では、フラグを使用してこれを有効にすることができました。

AFAIK クラスは、ClassLoader から参照されていない場合にアンロードされます。

java.lang.OutOfMemoryError: PermGen spaceエラーは、クラス ローダーでのメモリ リークが原因です。Web アプリケーションのアンデプロイ/再デプロイ時の一般的な問題。

于 2013-07-15T10:56:41.597 に答える
2

Hibernate はEntity、起動時にすべてのクラスをメモリにロードしSessionFactoryます。一方、Entity インスタンスは、必要な場合にのみロードされHibernateますlazy

クラスは、メモリが必要なGCときにアンロードできます。JVMエンティティ インスタンスもガベージ コレクションされますが、他のオブジェクトと同様に、エンティティ インスタンスを指す参照がなくなった場合にのみ行われます。つまり、セッションがまだ開いているEntity場合、インスタンスをアンロードできません。Hibernateそれらをアンロードするには、永続化コンテキストをクリアするか、セッションを閉じる必要があります。

于 2013-07-15T14:25:04.360 に答える