Javaクラスの荷を下す方法
Angsuman Chakraborty
2005年3月15日
私はこの質問に数回を頼まれた。 最近Xylingは彼のブログの同じ質問をした。 従って私は簡単な説明が順序であるかもしれないことを考えた。
クラスの荷を下すためには注文のclassloaderを作成し、それを使用してクラスに荷を積まなければならない。 雄猫はそれをし、従ってJRunをする。 例を雄猫コードを見ることができる。
クラスとされた後変数を割当て直すか、または無効にするために置くことによってクラスの積込み機にと同様、クラスへのすべての参照を解放する必要がある。
それからこれ以上のバイトが解放することができないまでクラスの荷を下すSystem.gcのための待ち時間()またはあなたはループのそれを直接呼ぶ。 どんなに普通それを呼んで二度功を奏する。
注: 単一のクラスの荷を下すことができない。 それと共にclassloaderの荷を下さなければならない。 そう明らかにシステムclassloaderはこの仕事のための適していない。
ノート2: これはJSPのページが変更コードいかに動的に必ず再積載されるかである。 それに続く時に荷を積むためにそしてはいそういうわけで初めては大いに時間がかかる。
いかにの下で に、ジャワ ソフトウェアファイルされる、 技術 |
|
RSS 2.0 |
この記事に電子メールを送りなさい
また読むのを好むかもしれない |


Technoratiの好みに加えなさい

































2005年3月15日6:31 pmの
こんにちは、
この情報を本当にありがとう。
私が私の質問自体をここに拡張するかどうか気にしなさいか。 実際には、私はURLClassLoaderによって私のクラスに荷を積む。 そして一般に私はURLClassLoaderによってローディングの瓶ファイルである。 今度は私はこの瓶ファイルに荷を下されてほしい。 私は瓶ファイルのためのURLClassLoaderにあなたの論理を拡張してもいいか。
2005年3月15日6:33 pmの
ありがとう。
2005年3月15日6:41 pmの
実際には、JSPの最初負荷時間はあるより遅かったらジャワをしたら再積載されるクラスがだけ原因である(bytecodeからクラスに荷を積むことはそれに時間がかからない、; -)。 次にbytecodeをJSPの源への変更がジャワの源に最初に変えられなければならない発生させるより重要な時間はClassLoaderによって荷を積むことができるバイトコードと同時に使われ。 従って、加えなさい2つを分析するか、または発生させる1つのバイトの負荷に周期を…
2005年3月16日4:28 pmの
クラスの動的再積載の興味深いねじれを見ることに興味があったら、http://www.platonos.orgで私達の差込式エンジンの源を 点検しなさい。 私達は差込しか、彼らの自身のclassloaderとのそれぞれ荷を積まないが、今動的に別のものに依存している差込式の部分の荷を下す機能を加えている。
差込式Bは実施をに提供すること差込式Aがインターフェイスを提供するとき結局、差込式B ClassLoaderは(Aのclassloaderへの委任を通して)実施のクラスのロック自体を握る。 私達はの後でさえも差込式Aのclassloaderを無効にする(Bの実施のクラスがロックを保つことA)の荷を下すことを試みればBのclassloaderはインターフェイスクラスのためにAのロックを保つ。 基本的にはこれがある:
インターフェイスpluginAInterface {}
クラスのpluginBImplはpluginAInterfaceを実行する{}
それぞれは別のclassloaderによって荷を積まれる。 使用されたとき、差込式BのclassloaderはそのpluginBImplの道具のpluginAInterfaceを見る。 それはそれを捜す差込式Bのclassloaderで始まる。 それは(pluginAInterfaceのクラスが差込式Aのclassloaderのclasspathにあるので)それをそこに見つけることができない。 差込式エンジンは差込式Aのclassloaderに調べにこのpluginAInterfaceのクラスのためのバイトコードを見つけるために委託する。 それはそこに、従って差込式Aのclassloader 「負荷」bytecode見つけたが、差込式Bのclassloaderはbytecodeを「それを見つけるAへの最初に委託によって見る」。 一度見つけられる、キャッシュストアで造られるclassloader classloader: クラスのポインター(意味、classloaderおよびクラスは記憶の実際のbytecodeにポインターとして一種の「キー」を構成する)従ってもはやそれはA.、大きい問題、主にクラスの参照に委託する必要性pluginBImplのクラスがそれを実行するインターフェイスのリストを所有することである維持することではないが。 これについての悪い事はランタイムに無効にするためにそこにであるこれを置く方法ない!
従って私達のトリックはそれを持つために差込式別のもの実行される各インターフェイスを許可するのにclassloaderを所有することであり差込式の内の第2 classloaderを使用することであり従って私達はそのを放棄してもいく得るために働くために再積載するか、または荷を下す。
それはこうかつであるが、功を奏する。 おそらくまだより隠された問題私達はまだ出くわしていない。
2005年3月18日3:00 AMの
はい@Goldy Lukka。 できるにべきである。 私がURLClassLoader、従って私をこのようなやり方で使用しなかったどんなに参照を堅に取除いてもらえば確実がない。 私はスパイクの解決が順序であることを推測する
BTW: 私はあなたの場所を楽しむ。
非常に報知的なコメントへの@Kevinの感謝。
2005年3月19日2:54 AMの
Goldy Lukka、
.jarファイルを再積載するか、または荷を下すのにURLClassLoaderの使用へのトリックは他のコードが.jarファイル内のクラスのうちのどれも参照していないことを確かめている。 依存は管理しにくい。 私達は互いによって差込の問題と大きい苦痛に解決することを試みることを荷を下すか、または再積載する行った。 私達はまだ問題をそれを作ることを起こって多くの場合もらう。 場合によっては、差込の開発者はちょうどきちんと他の差込式のクラスで持っている参照をきれいにするように差込式のできるだけ動的を作りたいと思えば実際にそれを開発しなければならないことわかっていなければならない。
あなたの.jarファイルが言うためにちょうど実施を加えれば中心の適用はAPIの容易にそれを取除けるべきであるインターフェイスさせる。 私達が発見したように、implemtingクラスは実行するインターフェイスの参照(ロック)を保つ。 従ってあなたの.jarファイルのクラスはへのrefを良いインターフェイス、単に無効にしたりそれをおよび/または無効にする.jarに荷を積んだうまくあるclassloaderを保ち。 しかし.jarファイルが他のクラスが(多分他の.jarファイルから)利用するインターフェイスを提供すれば、それはより困難になる。 荷を積まれた.jarの中からクラスを利用する.jarファイルに荷を積んだclassloaderの外のどのクラスでもまた荷を下されなければならない。 再度、私達のエンジンを示して、それは管理しにくい場合もあるでき事の荷を下すことの連鎖反応を始める。 私達は差込式ごとの2つのclassloaderの例を持っていることによって問題を解決した。 他の差込式のクラスによって実行されるインターフェイスを扱う1つ、およびクラスの残りのための1。 それはきれいではないが、これまでに働く。 私達はまだこれによりよいプロセスをするために実験している。
2005年3月22日7:35 pmの
ケビン、
それはこれが可能インターフェイスクラス(Class#getInterfaces ()無効にする)への参照をことができないこと本当である、ランタイムにバイトコードのインターフェイスを取除くことを、から意味する:
公共のクラスMyTestImplはTestImplを実行する
{
}
に
公共のクラスMyTestImpl
{
}
同じはsuperclassesにあてはまる。
2005年3月23日6:23 pmの
差込が仕事いかにであるかのはすばらしい情報である。 私は注文のクラスの積込み機の最も簡単で可能なコードを有してもいい。 最終的に注文のクラスの積込み機はデフォルトのclassloaderがまたはない荷を積まれるneesではないか。 そうそれからiがそのような種類のプログラムのcallgraphのclassloaderに見られればか。
2005年4月1日6:02 AMの
@Sandip URLClassLoaderを使用しないためになぜか。 またジャワの個人指導で提供されるサンプルClassLoaderコードがある。
2006年9月11日11:39 AMの
情報をありがとう。
私は私がいる何人かの人々のためにここに重要考えるインターネットで何かを読む:
2つのクラスは同じパッケージClassLoaderの異なった目的によって荷を積まれればではない!
2つのクラスが付いているパッケージを有することを仮定する、1つは公共およびパッケージ私用他である。 これらはClassLoader (かサブクラス)同じ目的によって荷を積まれるべきである。 公共のクラスがパッケージ私用クラスにアクセスすることを試みる時ランタイムエラーを得なければ。
従ってあらゆるクラスのためのClassLoaderの新しい目的を作ることを計画したら各パッケージのためにClassLoaderの1つの目的を使用することを考慮しなさい。 他の選択はすべてのクラスに公衆をすることである。