Submit Search
クラスローダーについて
27 likes
9,617 views
S
Suguru ARAKAWA
1 of 42
Download now
Downloaded 111 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
クラスローダーについて
1.
クラスローダーについて
わかる! JVM あらかわ (@ashigeru)
2.
本日の内容 クラスロードの仕組み クラスローダーの名前空間
リローディングの技術 その他の話題 アンロードの条件 パッケージプライベート シリアライゼーション 2010/08/06 #jvmjvm 2
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
5.
ロード処理の委譲 ロード中に他のクラスローダーを利用できる
loadClass()は最初に委譲先からクラスを検索 委譲先になければfindClass()を起動 2010/08/06 #jvmjvm 5
6.
“推奨”の委譲スタイル すでにロード済みのクラスがあればそれを返す 委譲先(親クラスローダー)でロード
委譲先でロードできなければ自身でロード 2010/08/06 #jvmjvm 6
7.
“推奨”委譲スタイルの問題 委譲先(親)とライブラリが衝突する
親のライブラリの内容が優先される パッケージ名変更で乗り切るバッドノウハウ 2010/08/06 #jvmjvm 7
8.
現実の委譲スタイル 某アプリケーションサーバー (PARENT_LAST)
委譲先(親)を最後に検索する 自身のクラスローダーをまず最初に検索 親のライブラリに影響を受けにくい OSGi パッケージごとにクラスの公開/非公開を選べる 委譲しても非公開クラスはロードできない 「親の親」はデフォルトで非公開扱い 複数の委譲先を持てる 必要なライブラリだけを選べる 2010/08/06 #jvmjvm 8
9.
ここまでのまとめ java.lang.ClassLoaderを継承してカスタムクラ
スローダーを作成 findClass()をオーバーライドする defineClass()にクラスファイルバイナリを渡す 他のクラスローダーにロードを委譲できる 通常は委譲先から順にクラスを探索 2010/08/06 #jvmjvm 9
10.
5.3 Creation and
Loading (defining loaders) 5.4.3.1 Class and Interface Resolution クラスローダーの空間 2010/08/06 #jvmjvm 10
11.
同じ名前のクラス 同じ名前のクラスは単一JVM上に存在できる?
WARなどが典型的 2010/08/06 #jvmjvm 11
12.
定義ローダー 同じ名前でも定義ローダーが違えば別クラス
defineClass()を実行したローダーのこと Class.getClassLoader()はこれを返す 2010/08/06 #jvmjvm 12
13.
参照先のロード 自身の定義ローダーで参照先をロード
下記のような依存関係は解決できない 2010/08/06 #jvmjvm 13
14.
PARENT_LASTの挙動 子が定義ローダーになりライブラリが共存可能
子になければ親のライブラリを利用 2010/08/06 #jvmjvm 14
15.
ドッペルゲンガー (1) PARENT_LASTでcommons-loggingを利用
commons-loggingは親子ともに所持 子のLogFactoryが優先される 2010/08/06 #jvmjvm 15
16.
ドッペルゲンガー (2) commons-loggingの実装を探しにいく
子には特別の実装が無いため次に親を探す 2010/08/06 #jvmjvm 16
17.
ドッペルゲンガー (3) LogFactoryの実装にLog4jFactoryを利用
Log4jFactoryの定義ローダーはCL1 2010/08/06 #jvmjvm 17
18.
ドッペルゲンガー (4) Log4jFactoryは親のLogFactoryを継承
定義ローダーの関係で親のものを利用する LogFactoryが二つ出現 2010/08/06 #jvmjvm 18
19.
ドッペルゲンガー (5) Log4jFactoryをLogFactory(CL2)に変換失敗
2つのLogFactoryは完全に別物 推奨の移譲スタイルはそれなりに意味がある 2010/08/06 #jvmjvm 19
20.
ここまでのまとめ 同じクラスでも定義ローダーが違えば別物
ドッペルゲンガーが出現することも 参照先のクラスは定義ローダーを使う PARENT_LASTなどと組み合わせると混乱する 2010/08/06 #jvmjvm 20
21.
クラスローダーを利用した擬似的なクラスリローディング リローディングの技術
2010/08/06 #jvmjvm 21
22.
リローディングの技術 JVMを立てたままクラスをリロードして即座に
変更を反映 JUnit 3系 – GUIについてたアレ Seasar 2 – Hot Deploy 他にもいろいろあると思う 2010/08/06 #jvmjvm 22
23.
リローディングの仕組み (1) リローディング用のクラスローダーを子に作成
親には利用したいクラスローダーを指定 2010/08/06 #jvmjvm 23
24.
リローディングの仕組み (2) 親からクラスファイルのバイナリを拝借
parent.getResourceAsStream() など 2010/08/06 #jvmjvm 24
25.
リローディングの仕組み (3) リローディング用のクラスローダーで定義
親を探しに行かない 普通はパッケージを限定する 2010/08/06 #jvmjvm 25
26.
リローディングの仕組み (4) リクエストごとにクラスローダーを作り直す
リクエストごとにクラスをリロード クラスの更新を反映させられる 2010/08/06 #jvmjvm 26
27.
リローディングとセッション セッション情報でドッペルゲンガー
2010/08/06 #jvmjvm 27
28.
ここまでのまとめ 定義ローダーを毎回捨ててリローディング
強制的に自分が定義ローダーになるようにする モデルの引継ぎが意外と大変 自作するとたいていハマる 2010/08/06 #jvmjvm 28
29.
2.17.8 Unloading of
Classes and Interfaces 5.3 Creation and Loading (runtime packages) (Object Serialization Specification) その他の話題 2010/08/06 #jvmjvm 29
30.
ネタ アンロードの条件 パッケージプライベート
シリアライゼーション 2010/08/06 #jvmjvm 30
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
36.
パッケージプライベート (2) 同じパッケージで別のクラスローダー
OSGi環境でのテストでよくやる 2010/08/06 #jvmjvm 36
37.
実行時パッケージ 実行時パッケージごとにプライベート
クラスの定義ローダーごとに別パッケージ扱い 先ほどの例は “IllegalAccessError” 2010/08/06 #jvmjvm 37
38.
シリアライゼーション ObjectInputStreamが使うクラスローダーは?
2010/08/06 #jvmjvm 38
39.
ObjectInputStream (1) 一番近いユーザー定義クラスローダーを利用
コールスタック上のクラスの定義ローダー この例ではBarのCL1を利用してデシリアライズ 2010/08/06 #jvmjvm 39
40.
ObjectInputStream (2) 親ローダーにシリアライゼーションフレームワ
ークを置いても使いにくい フレームワーククラスの定義ローダーを常に利用 ObjectInputStreamにはクラスローダーを指定 できない 以下のメソッドを上書きすれば対応は可能 resolveClass resolveProxy 2010/08/06 #jvmjvm 40
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
Download