SlideShare a Scribd company logo
クラスローダーについて

   わかる! JVM
 あらかわ (@ashigeru)
本日の内容
 クラスロードの仕組み
 クラスローダーの名前空間
 リローディングの技術
 その他の話題
  アンロードの条件
  パッケージプライベート
  シリアライゼーション




          2010/08/06 #jvmjvm   2
2.17.2 Loading
5 Loading, Linking, and Initializing
5.3.2 Loading Using a User-defined Class Loader

クラスロードの仕組み


                      2010/08/06 #jvmjvm          3
クラスローダーの作り方
  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
ロード処理の委譲
 ロード中に他のクラスローダーを利用できる
  loadClass()は最初に委譲先からクラスを検索
  委譲先になければfindClass()を起動




            2010/08/06 #jvmjvm   5
“推奨”の委譲スタイル
 すでにロード済みのクラスがあればそれを返す
 委譲先(親クラスローダー)でロード
 委譲先でロードできなければ自身でロード




         2010/08/06 #jvmjvm   6
“推奨”委譲スタイルの問題
 委譲先(親)とライブラリが衝突する
  親のライブラリの内容が優先される
  パッケージ名変更で乗り切るバッドノウハウ




          2010/08/06 #jvmjvm   7
現実の委譲スタイル
 某アプリケーションサーバー (PARENT_LAST)
   委譲先(親)を最後に検索する
    自身のクラスローダーをまず最初に検索
    親のライブラリに影響を受けにくい
 OSGi
   パッケージごとにクラスの公開/非公開を選べる
    委譲しても非公開クラスはロードできない
    「親の親」はデフォルトで非公開扱い
   複数の委譲先を持てる
    必要なライブラリだけを選べる

            2010/08/06 #jvmjvm   8
ここまでのまとめ
 java.lang.ClassLoaderを継承してカスタムクラ
  スローダーを作成
  findClass()をオーバーライドする
  defineClass()にクラスファイルバイナリを渡す
 他のクラスローダーにロードを委譲できる
  通常は委譲先から順にクラスを探索




              2010/08/06 #jvmjvm   9
5.3 Creation and Loading (defining loaders)
5.4.3.1 Class and Interface Resolution

クラスローダーの空間


                      2010/08/06 #jvmjvm      10
同じ名前のクラス
 同じ名前のクラスは単一JVM上に存在できる?
  WARなどが典型的




           2010/08/06 #jvmjvm   11
定義ローダー
 同じ名前でも定義ローダーが違えば別クラス
  defineClass()を実行したローダーのこと
  Class.getClassLoader()はこれを返す




              2010/08/06 #jvmjvm   12
参照先のロード
 自身の定義ローダーで参照先をロード
  下記のような依存関係は解決できない




          2010/08/06 #jvmjvm   13
PARENT_LASTの挙動
 子が定義ローダーになりライブラリが共存可能
  子になければ親のライブラリを利用




          2010/08/06 #jvmjvm   14
ドッペルゲンガー (1)
 PARENT_LASTでcommons-loggingを利用
  commons-loggingは親子ともに所持
  子のLogFactoryが優先される




              2010/08/06 #jvmjvm   15
ドッペルゲンガー (2)
 commons-loggingの実装を探しにいく
  子には特別の実装が無いため次に親を探す




             2010/08/06 #jvmjvm   16
ドッペルゲンガー (3)
 LogFactoryの実装にLog4jFactoryを利用
   Log4jFactoryの定義ローダーはCL1




               2010/08/06 #jvmjvm   17
ドッペルゲンガー (4)
 Log4jFactoryは親のLogFactoryを継承
   定義ローダーの関係で親のものを利用する
   LogFactoryが二つ出現




               2010/08/06 #jvmjvm   18
ドッペルゲンガー (5)
 Log4jFactoryをLogFactory(CL2)に変換失敗
   2つのLogFactoryは完全に別物
   推奨の移譲スタイルはそれなりに意味がある




               2010/08/06 #jvmjvm     19
ここまでのまとめ
 同じクラスでも定義ローダーが違えば別物
  ドッペルゲンガーが出現することも
 参照先のクラスは定義ローダーを使う
  PARENT_LASTなどと組み合わせると混乱する




           2010/08/06 #jvmjvm   20
クラスローダーを利用した擬似的なクラスリローディング

リローディングの技術


            2010/08/06 #jvmjvm   21
リローディングの技術
 JVMを立てたままクラスをリロードして即座に
  変更を反映
  JUnit 3系 – GUIについてたアレ
  Seasar 2 – Hot Deploy
  他にもいろいろあると思う




              2010/08/06 #jvmjvm   22
リローディングの仕組み (1)
 リローディング用のクラスローダーを子に作成
  親には利用したいクラスローダーを指定




          2010/08/06 #jvmjvm   23
リローディングの仕組み (2)
 親からクラスファイルのバイナリを拝借
  parent.getResourceAsStream() など




                2010/08/06 #jvmjvm   24
リローディングの仕組み (3)
 リローディング用のクラスローダーで定義
  親を探しに行かない
  普通はパッケージを限定する




          2010/08/06 #jvmjvm   25
リローディングの仕組み (4)
 リクエストごとにクラスローダーを作り直す
  リクエストごとにクラスをリロード
  クラスの更新を反映させられる




          2010/08/06 #jvmjvm   26
リローディングとセッション
 セッション情報でドッペルゲンガー




          2010/08/06 #jvmjvm   27
ここまでのまとめ
 定義ローダーを毎回捨ててリローディング
  強制的に自分が定義ローダーになるようにする
 モデルの引継ぎが意外と大変
  自作するとたいていハマる




          2010/08/06 #jvmjvm   28
2.17.8 Unloading of Classes and Interfaces
5.3 Creation and Loading (runtime packages)
(Object Serialization Specification)

その他の話題


                     2010/08/06 #jvmjvm       29
ネタ
 アンロードの条件
 パッケージプライベート
 シリアライゼーション




          2010/08/06 #jvmjvm   30
アンロードの条件 (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
アンロードの条件 (2)
 クラスローダーがGCで回収可能になるまで、ク
  ラスは一つもアンロードされない
  先ほどの例は80,000~くらいでメモリ枯渇した

 インスタンスやjava.lang.Classを保持している
  とクラスローダーがGC回収可能にならない
  一つでもリークしたら全てのクラスがリーク
  共有空間でキャッシュしてたりすると大変
  ライフサイクルの管理が重要になる


             2010/08/06 #jvmjvm   32
アンロードの条件 (3)
 クラスをアンロードさせたい場合には定期的に
  クラスローダーを捨てる
  キャッシュするならライフサイクルに注意
  特に共有空間に漏れないように
  動的クラス生成を行うフレームワークは要注意
  アスペクトウィービング
  スクリプト言語のJITコンパイラ
 ただし、アンロードは「最適化」という扱い
  メモリ効率の向上
  アンロード自体に対応していない可能性も

           2010/08/06 #jvmjvm   33
アンロードの条件 (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
パッケージプライベート (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
パッケージプライベート (2)
 同じパッケージで別のクラスローダー
  OSGi環境でのテストでよくやる




           2010/08/06 #jvmjvm   36
実行時パッケージ
 実行時パッケージごとにプライベート
  クラスの定義ローダーごとに別パッケージ扱い
  先ほどの例は “IllegalAccessError”




            2010/08/06 #jvmjvm   37
シリアライゼーション
 ObjectInputStreamが使うクラスローダーは?




             2010/08/06 #jvmjvm   38
ObjectInputStream (1)
 一番近いユーザー定義クラスローダーを利用
  コールスタック上のクラスの定義ローダー
  この例ではBarのCL1を利用してデシリアライズ




           2010/08/06 #jvmjvm   39
ObjectInputStream (2)
 親ローダーにシリアライゼーションフレームワ
  ークを置いても使いにくい
  フレームワーククラスの定義ローダーを常に利用
  ObjectInputStreamにはクラスローダーを指定
   できない
 以下のメソッドを上書きすれば対応は可能
  resolveClass
  resolveProxy




                  2010/08/06 #jvmjvm   40
ObjectInputStream (3)
 以下の組み合わせは怪しい
  カスタムクラスローダー
  オブジェクト永続化 (XML, JSON等も含む)

 OSGi + Object DBは個人的に鬼門
  どのクラスローダーでロードすれば?
  クラスローダーをまたいでネストしたモデルは?
  あまりいい思い出がない



              2010/08/06 #jvmjvm   41
参考文献
 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

More Related Content

What's hot (20)

PDF
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
Hironobu Isoda
 
PDF
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
 
PDF
Docker Compose 徹底解説
Masahito Zembutsu
 
PDF
オンプレを少しずつコンテナ化する
Kenkichi Okazaki
 
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
 
PDF
OpenJDK トラブルシューティング #javacasual
Yuji Kubota
 
PDF
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
PDF
アーキテクチャから理解するPostgreSQLのレプリケーション
Masahiko Sawada
 
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
NTT DATA Technology & Innovation
 
PPTX
jcmd をさわってみよう
Tsunenaga Hanyuda
 
PDF
ClassLoader Leak Patterns
nekop
 
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
 
PDF
Fluentdのお勧めシステム構成パターン
Kentaro Yoshida
 
PDF
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
PDF
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
 
PDF
Docker道場オンライン#1 Docker基礎概念と用語の理解
Masahito Zembutsu
 
PDF
ブルックスのいう銀の弾丸とは何か?
Yoshitaka Kawashima
 
PPTX
[社内勉強会]ELBとALBと数万スパイク負荷テスト
Takahiro Moteki
 
PDF
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
ssuser070fa9
 
PDF
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
 
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
Hironobu Isoda
 
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
 
Docker Compose 徹底解説
Masahito Zembutsu
 
オンプレを少しずつコンテナ化する
Kenkichi Okazaki
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
 
OpenJDK トラブルシューティング #javacasual
Yuji Kubota
 
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
アーキテクチャから理解するPostgreSQLのレプリケーション
Masahiko Sawada
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
NTT DATA Technology & Innovation
 
jcmd をさわってみよう
Tsunenaga Hanyuda
 
ClassLoader Leak Patterns
nekop
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
 
Fluentdのお勧めシステム構成パターン
Kentaro Yoshida
 
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Masahito Zembutsu
 
ブルックスのいう銀の弾丸とは何か?
Yoshitaka Kawashima
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
Takahiro Moteki
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
ssuser070fa9
 
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
 

Viewers also liked (18)

PPTX
java.lang.OutOfMemoryError #渋谷java
Yuji Kubota
 
PDF
JVM のいろはにほ #javajo
Yuji Kubota
 
PDF
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
Yuji Kubota
 
PPTX
GCについて
cactusman
 
PDF
GCが止まらない
Narihiro Nakamura
 
PPT
Javaバイトコード入門
Kota Mizushima
 
PPTX
Java トラブル解析支援ツール HeapStats のご紹介
Shinya Takebayashi
 
PPTX
HeapStats(Java解析ツールバトル)
Yasumasa Suenaga
 
PDF
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと
Y Watanabe
 
PDF
JVM-Reading-ConcurrentMarkSweep
Minoru Nakamura
 
PPTX
Metaspace
Yasumasa Suenaga
 
PDF
負荷テストを行う際に知っておきたいこと 初心者編
まべ☆てっく運営
 
PDF
新版 OutOfMemoryErrorを知る
Masahiro Hidaka
 
PPTX
第六回渋谷Java Java8のJVM監視を考える
chonaso
 
PDF
徹底解説!Project Lambdaのすべて[JJUG CCC 2013 Fall H-2]
bitter_fox
 
PPTX
HotSpotコトハジメ
Yasumasa Suenaga
 
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
 
PDF
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Yahoo!デベロッパーネットワーク
 
java.lang.OutOfMemoryError #渋谷java
Yuji Kubota
 
JVM のいろはにほ #javajo
Yuji Kubota
 
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
Yuji Kubota
 
GCについて
cactusman
 
GCが止まらない
Narihiro Nakamura
 
Javaバイトコード入門
Kota Mizushima
 
Java トラブル解析支援ツール HeapStats のご紹介
Shinya Takebayashi
 
HeapStats(Java解析ツールバトル)
Yasumasa Suenaga
 
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと
Y Watanabe
 
JVM-Reading-ConcurrentMarkSweep
Minoru Nakamura
 
Metaspace
Yasumasa Suenaga
 
負荷テストを行う際に知っておきたいこと 初心者編
まべ☆てっく運営
 
新版 OutOfMemoryErrorを知る
Masahiro Hidaka
 
第六回渋谷Java Java8のJVM監視を考える
chonaso
 
徹底解説!Project Lambdaのすべて[JJUG CCC 2013 Fall H-2]
bitter_fox
 
HotSpotコトハジメ
Yasumasa Suenaga
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
 
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Yahoo!デベロッパーネットワーク
 
Ad

Similar to クラスローダーについて (20)

PDF
Javaセキュアコーディングセミナー東京第1回 講義
JPCERT Coordination Center
 
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
JBoss AS 7 / EAP 6 modules and class loading
nekop
 
PDF
夏だからJava再入門
Katsumi Honda
 
KEY
関ジャバ JavaOne Tokyo 2012報告会
Koichi Sakata
 
PDF
Java 7 invokedynamic の概要
Taku Miyakawa
 
PDF
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
PE-BANK
 
PPTX
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
Yuki Morishita
 
PDF
Web技術勉強会 20110723
龍一 田中
 
KEY
Java基礎
Hiroki Mizuno
 
PDF
Valhalla Update JJUG CCC Spring 2019
David Buck
 
PPTX
Cve 2013-0422
abend_cve_9999_0001
 
PDF
Javaクラスファイルの読み方
y torazuka
 
PDF
Xcore introduction
Akira Tanaka
 
PPTX
Xtend の紹介
Oda Shinsuke
 
PDF
InvokeDynamic at #shikadriven 2012
Go Tanaka
 
PPTX
LLoT2016 Java Update
torutk
 
PDF
Gradleどうでしょう
Takuma Watabiki
 
PDF
Var handles jjug_ccc_spring_2018
David Buck
 
PDF
Adaptive optimization of JIT compiler
nothingcosmos
 
Javaセキュアコーディングセミナー東京第1回 講義
JPCERT Coordination Center
 
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
JBoss AS 7 / EAP 6 modules and class loading
nekop
 
夏だからJava再入門
Katsumi Honda
 
関ジャバ JavaOne Tokyo 2012報告会
Koichi Sakata
 
Java 7 invokedynamic の概要
Taku Miyakawa
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
PE-BANK
 
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
Yuki Morishita
 
Web技術勉強会 20110723
龍一 田中
 
Java基礎
Hiroki Mizuno
 
Valhalla Update JJUG CCC Spring 2019
David Buck
 
Cve 2013-0422
abend_cve_9999_0001
 
Javaクラスファイルの読み方
y torazuka
 
Xcore introduction
Akira Tanaka
 
Xtend の紹介
Oda Shinsuke
 
InvokeDynamic at #shikadriven 2012
Go Tanaka
 
LLoT2016 Java Update
torutk
 
Gradleどうでしょう
Takuma Watabiki
 
Var handles jjug_ccc_spring_2018
David Buck
 
Adaptive optimization of JIT compiler
nothingcosmos
 
Ad

Recently uploaded (8)

PDF
go tool と Minimal Version Selection アルゴリズム
Keisuke Ishigami
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
2023年版Web3技術の理想と現実
Syuhei Hiya
 
PDF
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
PPTX
オープンソース界隈の利用者や技術者から見たオープンソースEDAとは? What is open source EDA from the perspecti...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
 
PPTX
新卒・中途採用者向け採用ピッチ資料2025年7月版(20250702).pptx
Official74
 
go tool と Minimal Version Selection アルゴリズム
Keisuke Ishigami
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
2023年版Web3技術の理想と現実
Syuhei Hiya
 
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
オープンソース界隈の利用者や技術者から見たオープンソースEDAとは? What is open source EDA from the perspecti...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
 
新卒・中途採用者向け採用ピッチ資料2025年7月版(20250702).pptx
Official74
 

クラスローダーについて