2012-03-08 2 views
10

私はJavaでClassLoaderを学んでいます。なぜ、JVMが多くのクラスローダーを持っているのか、知りたがっています。 1つの最初のロード<Java_Runtime_Home>/lib、次に<Java_Runtime_Home>/lib/extのロード、最後のロードclasspathなぜjvmに多数のclasloaderがあるのですか?なぜではない?

カスタムクラスローダーがある場合は、システムが最初です。

誰かがJVMに多くのクラスローダーがある理由を教えていただけますか?

答えて

17

非常に便利なアプリケーションの1つは、複数のWebアプリケーションを単一のJava EEサーバーにデプロイできることです。

各アプリケーションでは、同じライブラリの異なるバージョンを使用する可能性があります。したがって、1つのJVMで同じクラスの異なるバージョンを使用できるようにするには、別のバージョンのクラスローダーを使用する必要があります。

+0

ウェブサーバーには独自のloader.itがあり、複数のクラスローダーを持つことができます。 – liuxiaori

+0

多分私はkonw!ありがとう! – liuxiaori

+0

無関係なメモでは、単一のJVMは、Singletonの複数のインスタンスを持つことができますか?クラスローダーごとに1つ? – user1071840

4

同じJVMで複数のアプリケーションを実行できます。

実行中のシステムでコードの一部をアンロードしてアップグレードすることもできます。あなたが複数のクラスローダをサポートするには、いくつかの理由がありhttp://www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html

6

便利なのOSGiについての情報を見つけるかもしれない

(一つだけのアプリケーションを持っている場合でも)。

最初に:クラスの分離。 アプリケーションサーバーを想像してみてください。複数の独立したプロジェクトには同じライブラリが含まれる場合があります。各アプリケーションに独自のクラスローダがある場合、衝突なしに異なるバージョンをロードすることができ、AFAIK静的フィールドはクラスローダごとにインスタンス化されます。

2番目:クラスローダーを上書きしてクラスを変更することができます。 クラスローダーは、ロード時にクラスを拡張できます。アスペクト指向プログラミング(AspectJ)またはデバッグまたはプロファイリングコードの追加に役立ちます。 1つのライブラリのみを変更する簡単な方法は、別のクラスローダを使用してライブラリをロードすることです。

5

enter image description here クラスローダーは階層型であり、クラスをロードするときに委譲モデルを使用します。クラスローダは、自分自身をロードしようとする前に、自分の 親にクラスをロードするよう要求します。クラスローダーがクラスをロードすると、階層のクラスローダー はクラスを再びリロードしません。従って、一意性は維持される。子クラスローダーによって がロードされたクラスは、階層の上にある親によってロードされたクラスの可視性を持っていますが、その逆は真ではありません。

関連する問題