2012-04-20 9 views
5

1)次のClass.forName()を複数回呼び出すと、メモリリークが発生しますか?class.fornameを複数回使用するとメモリリークが発生しますか? (Tomcat内で実行中)

Class.forName("MyClass") 

2)または、すでにロードされ、代わりにキャッシュされたインスタンスを使用している"MyClass"かどうかを確認しようとしてTomcatのWebAppClassLoaderです。私がPermGenを有効にして、適切なjvmパラメータを設定すると、質問(2)の答えが 'no'の場合、以前にロードされたクラスがガベージコレクションされますか?

クラスのリロードを避けたい場合は、クラスインスタンスキャッシュを使用する最善の方法は何ですか。私は、ドキュメントからのHashMap

+0

最初に同じクラスローダーからロードされている限り、メモリがリークするとは思わない。また、ClassLoaderは時間の経過とともに変化する可能性は低いです。 –

答えて

9

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

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

2)はい

3)N/

4)参照記事は、1)下ので、私の説明、クラスが別のクラスローダで再ロードされることに言及当てはまります。

+0

これは、Tomcatが提供するこのWebアプリケーションのクラスローダーと同じクラスローダーを使用するとします。 –

+1

@samarjitsamanta、おそらくはい、私はTomcatの専門家ではないので、保証として私の言葉を取ってはいけません: –

+0

はい4番目の質問の答えは、クラスローダーとクラスインスタンスが混在した私の少し愚かな部分でした: )私はそれを認識し、無関係な質問を削除しました。迅速な答えに感謝します。 –

0

としてクラスのインスタンスを保存することができます:

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

クラスを再度読み込む必要がないことがわかります。複数回呼び出すことが安全であることを示すだけで返します。

関連する問題