5

1) 次の Class.forName() を使用すると、複数回呼び出された場合、メモリ リークが発生しますか?

Class.forName("MyClass") 

2) または、Tomcat の WebAppClassLoader"MyClass"は、既にロードされているかどうかを確認し、代わりにキャッシュされたインスタンスを使用します。

3) 質問 (2) に対する答えが「いいえ」の場合、PermGen スイープをオンにして関連する jvm パラメータを設定した場合、以前にロードされたクラスはガベージ コレクションを取得しますか。

クラスのリロードを避けたい場合、クラス インスタンス キャッシュを使用する最善の方法は何ですか。クラス インスタンスを HashMap として保存できますか

4

2 に答える 2

10

1)いいえ、1つのクラス定義は特定のクラスローダーによって1回だけロードされます。その後、メモリ(PermGenスペース)に保持され、クラスローダーが存在するまで、クラスへの後続の参照で再利用されます。これは、クラスがどのように参照されるかとは無関係Class.forNameですClassLoader.loadClass

ただし、同じクラス定義を異なるクラスローダーに複数回ロードすることができます(メモリ内に複数のクラストークンオブジェクトが作成されます)。これらは完全に異なるクラスとしてカウントされ、まったく同じクラスファイルからロードされた場合でも、相互にキャストすることはできません。

2)はい

3)該当なし

4)参照された記事には、クラスが別のクラスローダーにリロードされると記載されているため、1)の説明が適用されます。

于 2012-04-20T10:38:55.070 に答える
0

ドキュメントから:

指定された文字列名を持つクラスまたはインターフェースに関連付けられた Class オブジェクトを返します。

クラスを再度ロードする必要があるという兆候は見られません。複数回呼び出しても安全であることを示すだけです。

于 2012-04-20T10:37:53.943 に答える