Weitere ähnliche Inhalte
Ähnlich wie クラスローダーについて (20)
Kürzlich hochgeladen (12)
クラスローダーについて
- 3. 2.17.2 Loading
5 Loading, Linking, and Initializing
5.3.2 Loading Using a User-defined Class Loader
クラスロードの仕組み
2010/08/06 #jvmjvm 3
- 4. クラスローダーの作り方
1. java.lang.ClassLoaderのサブクラスを定義
2. findClass()をオーバーライド
3. クラスファイルをdefineClass()に食わせる
4. 結果のjava.lang.Classを返す
public class MyClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String name) throws … {
byte[] content = …;
Class<?> aClass = defineClass(name, content, 0, content.length);
return aClass;
}
…
2010/08/06 #jvmjvm 4
- 8. 現実の委譲スタイル
某アプリケーションサーバー (PARENT_LAST)
委譲先(親)を最後に検索する
自身のクラスローダーをまず最初に検索
親のライブラリに影響を受けにくい
OSGi
パッケージごとにクラスの公開/非公開を選べる
委譲しても非公開クラスはロードできない
「親の親」はデフォルトで非公開扱い
複数の委譲先を持てる
必要なライブラリだけを選べる
2010/08/06 #jvmjvm 8
- 10. 5.3 Creation and Loading (defining loaders)
5.4.3.1 Class and Interface Resolution
クラスローダーの空間
2010/08/06 #jvmjvm 10
- 29. 2.17.8 Unloading of Classes and Interfaces
5.3 Creation and Loading (runtime packages)
(Object Serialization Specification)
その他の話題
2010/08/06 #jvmjvm 29
- 31. アンロードの条件 (1)
このプログラムはどうなる?
C0, C1, C2, …は全てロード可能とする
ClassLoader cl = new InfiniteClassLoader();
for (long i = 0; i < Long.MAX_VALUE; i++) {
cl.loadClass("C" + i);
}
2010/08/06 #jvmjvm 31
- 32. アンロードの条件 (2)
クラスローダーがGCで回収可能になるまで、ク
ラスは一つもアンロードされない
先ほどの例は80,000~くらいでメモリ枯渇した
インスタンスやjava.lang.Classを保持している
とクラスローダーがGC回収可能にならない
一つでもリークしたら全てのクラスがリーク
共有空間でキャッシュしてたりすると大変
ライフサイクルの管理が重要になる
2010/08/06 #jvmjvm 32
- 33. アンロードの条件 (3)
クラスをアンロードさせたい場合には定期的に
クラスローダーを捨てる
キャッシュするならライフサイクルに注意
特に共有空間に漏れないように
動的クラス生成を行うフレームワークは要注意
アスペクトウィービング
スクリプト言語のJITコンパイラ
ただし、アンロードは「最適化」という扱い
メモリ効率の向上
アンロード自体に対応していない可能性も
2010/08/06 #jvmjvm 33
- 34. アンロードの条件 (4)
2,000,000クラスまで確認 (飽きた)
クラスローダーを毎回捨てている
ClassLoader cl = new InfiniteClassLoader();
for (long i = 0; i < Long.MAX_VALUE; i++) {
ClassLoader cl = new InfiniteClassLoader();
cl.loadClass("C" + i);
}
2010/08/06 #jvmjvm 34
- 35. パッケージプライベート (1)
パッケージプライベートのアクセス制御は?
package a;
public class Hoge {
/*package*/ int foo() {
return 100;
}
}
package a;
public class HogeTest {
@Test
public void about_package() {
Hoge hoge = new Hoge();
assertThat(hoge.foo(), is(100));
}
}
2010/08/06 #jvmjvm 35
- 41. ObjectInputStream (3)
以下の組み合わせは怪しい
カスタムクラスローダー
オブジェクト永続化 (XML, JSON等も含む)
OSGi + Object DBは個人的に鬼門
どのクラスローダーでロードすれば?
クラスローダーをまたいでネストしたモデルは?
あまりいい思い出がない
2010/08/06 #jvmjvm 41
- 42. 参考文献
Java仮想マシン仕様 第2版
ISBN: 4-89471-356-X
Java言語仕様 第3版
ISBN: 4-89471-715-8
JSR 202: Java Class File Specification Update
http://jcp.org/en/jsr/summary?id=202
“オブジェクト直列化形式”
http://java.sun.com/javase/ja/6/docs/ja/techno
tes/guides/serialization/
2010/08/06 #jvmjvm 42