Suche senden
Hochladen
ClassLoader Leak Patterns
•
30 gefällt mir
•
8,914 views
N
nekop
Folgen
Technologie
Melden
Teilen
Melden
Teilen
1 von 30
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Norito Agetsuma
Metaspace
Metaspace
Yasumasa Suenaga
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
SpringBootTest入門
SpringBootTest入門
Yahoo!デベロッパーネットワーク
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて
Yoshimasa Tanabe
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
Empfohlen
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Norito Agetsuma
Metaspace
Metaspace
Yasumasa Suenaga
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
SpringBootTest入門
SpringBootTest入門
Yahoo!デベロッパーネットワーク
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて
Yoshimasa Tanabe
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
Preferred Networks
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
歩 柴田
Unified JVM Logging
Unified JVM Logging
Yuji Kubota
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
NTT DATA Technology & Innovation
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
貴仁 大和屋
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
Kohei Tokunaga
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
Uptime Technologies LLC (JP)
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
Takahiro YAMADA
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
Daichi Koike
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動
Kohei Tokunaga
k8s初心者が gRPC × envoyを導入したら色々苦労した話 #yjbonfire
k8s初心者が gRPC × envoyを導入したら色々苦労した話 #yjbonfire
Yahoo!デベロッパーネットワーク
クラスローダーについて
クラスローダーについて
Suguru ARAKAWA
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Masahito Zembutsu
Migration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjug
Yuji Kubota
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ
Satoshi Takami
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
NTT DATA Technology & Innovation
コンテナ環境でJavaイメージを小さくする方法!
コンテナ環境でJavaイメージを小さくする方法!
オラクルエンジニア通信
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
Samir Hammoudi
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
Best practice laravel
Best practice laravel
Risa Ohnishi
Weitere ähnliche Inhalte
Was ist angesagt?
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
Preferred Networks
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
歩 柴田
Unified JVM Logging
Unified JVM Logging
Yuji Kubota
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
NTT DATA Technology & Innovation
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
貴仁 大和屋
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
Kohei Tokunaga
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
Uptime Technologies LLC (JP)
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
Takahiro YAMADA
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
Daichi Koike
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動
Kohei Tokunaga
k8s初心者が gRPC × envoyを導入したら色々苦労した話 #yjbonfire
k8s初心者が gRPC × envoyを導入したら色々苦労した話 #yjbonfire
Yahoo!デベロッパーネットワーク
クラスローダーについて
クラスローダーについて
Suguru ARAKAWA
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Masahito Zembutsu
Migration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjug
Yuji Kubota
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ
Satoshi Takami
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
NTT DATA Technology & Innovation
コンテナ環境でJavaイメージを小さくする方法!
コンテナ環境でJavaイメージを小さくする方法!
オラクルエンジニア通信
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
Samir Hammoudi
Was ist angesagt?
(20)
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
Unified JVM Logging
Unified JVM Logging
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動
k8s初心者が gRPC × envoyを導入したら色々苦労した話 #yjbonfire
k8s初心者が gRPC × envoyを導入したら色々苦労した話 #yjbonfire
クラスローダーについて
クラスローダーについて
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Migration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjug
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ
[JJUG CCC 2021 Spring]Eclipse ユーザのための VSCode のススメ
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
コンテナ環境でJavaイメージを小さくする方法!
コンテナ環境でJavaイメージを小さくする方法!
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
Ähnlich wie ClassLoader Leak Patterns
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
Best practice laravel
Best practice laravel
Risa Ohnishi
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
Tsuyoshi Yamamoto
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
JustSystems Corporation
jjugccc2018 app review postmortem
jjugccc2018 app review postmortem
tamtam180
Trait in scala
Trait in scala
Yuta Shimakawa
Google App Engine for Java
Google App Engine for Java
Takuya Tsuchida
MoteMote Compiler Plugin
MoteMote Compiler Plugin
yoshiaki iwanaga
明日から使える Java SE 7
明日から使える Java SE 7
Yuichi Sakuraba
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
kunihikokaneko1
ATN No.2 Scala事始め
ATN No.2 Scala事始め
AdvancedTechNight
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用について
kimukou_26 Kimukou
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
pi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマー
kunihikokaneko1
20110820 metaprogramming
20110820 metaprogramming
Masanori Kado
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
Norito Agetsuma
Scala EE 7 Essentials
Scala EE 7 Essentials
tnoda
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
David Buck
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
takezoe
JavaLearning_1.pptx
JavaLearning_1.pptx
RyuuGaku
Ähnlich wie ClassLoader Leak Patterns
(20)
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
Best practice laravel
Best practice laravel
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
jjugccc2018 app review postmortem
jjugccc2018 app review postmortem
Trait in scala
Trait in scala
Google App Engine for Java
Google App Engine for Java
MoteMote Compiler Plugin
MoteMote Compiler Plugin
明日から使える Java SE 7
明日から使える Java SE 7
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
ATN No.2 Scala事始め
ATN No.2 Scala事始め
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用について
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
pi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマー
20110820 metaprogramming
20110820 metaprogramming
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
Scala EE 7 Essentials
Scala EE 7 Essentials
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
JavaLearning_1.pptx
JavaLearning_1.pptx
Mehr von nekop
Java Drag Race Tuning
Java Drag Race Tuning
nekop
JBoss AS 7 / EAP 6 modules and class loading
JBoss AS 7 / EAP 6 modules and class loading
nekop
Module classloading
Module classloading
nekop
JBoss AS7 rev3
JBoss AS7 rev3
nekop
Infinispan - Open Source Data Grid rev2
Infinispan - Open Source Data Grid rev2
nekop
JBoss AS7 rev2
JBoss AS7 rev2
nekop
JBoss AS7
JBoss AS7
nekop
CDI, Seam 3 and Forge
CDI, Seam 3 and Forge
nekop
Infinispan - Open Source Data Grid
Infinispan - Open Source Data Grid
nekop
Iteratorパターン
Iteratorパターン
nekop
Proxy
Proxy
nekop
mod_cluster
mod_cluster
nekop
Mehr von nekop
(12)
Java Drag Race Tuning
Java Drag Race Tuning
JBoss AS 7 / EAP 6 modules and class loading
JBoss AS 7 / EAP 6 modules and class loading
Module classloading
Module classloading
JBoss AS7 rev3
JBoss AS7 rev3
Infinispan - Open Source Data Grid rev2
Infinispan - Open Source Data Grid rev2
JBoss AS7 rev2
JBoss AS7 rev2
JBoss AS7
JBoss AS7
CDI, Seam 3 and Forge
CDI, Seam 3 and Forge
Infinispan - Open Source Data Grid
Infinispan - Open Source Data Grid
Iteratorパターン
Iteratorパターン
Proxy
Proxy
mod_cluster
mod_cluster
ClassLoader Leak Patterns
1.
クラスローダ リークパターン なにそれおいしいの?
Takayoshi Kimura Senior Software Maintenance Engineer, JBoss Global Support Service Red Hat
2.
自己紹介
3.
nekop ● JBoss の中の人 ●
Emacs で Java 書く人 ● オープンソース大好きっ子 ● ネコよりイヌが好き
4.
宣伝
5.
JBoss では エンジニアを
募集して おります!
6.
JBoss で働きませんか ● Java
とオープンソースが好き な人におすすめ ● おやつ無料 ● 飲み物自動販売機無料
7.
JBoss で働きませんか ● 主に「オープンソースで遊ぶ」
のと「技術的な人助け」 ● Linux カーネルから Java アー キテクトまで豊富な同僚
8.
本題
9.
クラスローダ リーク
10.
何が起こる? ● java.lang.OutOfMemoryError:
perm gen space ● クラス定義情報が置いてあるメ モリ領域 (Perm) を消費しっぱ なし
11.
いつリークする? ● クラスローダが破棄、再作成さ
れるタイミング ● 具体例として、アプリケーショ ンサーバに再デプロイを行った とき
12.
なぜリークする? ● そのクラスローダへの参照が
残ってるから ● そのクラスローダからロードさ れたクラスへの参照が残ってる から ● クラスローダをまたがる参照
13.
パターン
その1 ThreadLocal
14.
ThreadLocal ● 同一スレッド上で値の受け渡し
ができて便利 ● フレームワークなどでよく使わ れている
15.
ThreadLocal の参照構造 ● ThreadLocal
に設定した値は Thread から強参照される ● 詳しく知りたい人はソース嫁
16.
ThreadLocal 開放条件 ● ThreadLocal
へ到達可能な強参 照が一つもない場合開放される ● Thread が開放されたら一緒に 開放される
17.
ありがちなリークコード public class ThreadLocalKeyValue
{ private ThreadLocal tl = new ThreadLocal(); public void add(Object key, Object value) { tl.set(new KeyValuePair(key, value)); } public Object getKey() { return ((KeyValuePair)tl.get()).key; } public Object getValue() { return ((KeyValuePair)tl.get()).value; } private class KeyValuePair { public Object key, value; public KeyValuePair(Object key, Object value) { this.key = key; this.value = value; } } }
18.
テスト ThreadLocalKeyValue target =
new ThreadLocalKeyValue(); ReferenceQueue queue = new ReferenceQueue(); PhantomReference ref = new PhantomReference(target, queue); target.add("foo", "bar"); target = null; System.gc(); System.out.println("Released?: " + ref.isEnqueued());
19.
テスト結果 false って何よ
( ゚Д゚)
20.
修正 public class ThreadLocalKeyValue
{ private ThreadLocal tl = new ThreadLocal(); public void add(Object key, Object value) { tl.set(new KeyValuePair(key, value)); } public Object getKey() { return ((KeyValuePair)tl.get()).key; } public Object getValue() { return ((KeyValuePair)tl.get()).value; } private static class KeyValuePair { public Object key, value; public KeyValuePair(Object key, Object value) { this.key = key; this.value = value; } } }
21.
テスト結果 true
22.
ハァ ? ( ゚Д゚)
23.
ThreadLocal まとめ ●
設定した値は Thread から強参照される ● ThreadLocal に渡す「値」の参照関係に注意 ● スレッドのコントロールが自分に無い環境では Thread の開放に伴う ThreadLocal の開放は 期待できない – アプリケーションサーバ上では当然スレッドは プールされている – リークしないのは「入れたら確実に消す ( 一時的な 利用 ) 」か「入れっぱなしでも値の参照関係が安 全だと保証できる」場合のみ
24.
ThreadLocal と Tomcat ●
Tomcat はアンデプロイ時に ThreadLocal を リフレクションで開放してくれる機能がある – アプリケーションやフレームワーク、ライブラリ のクラスローダリークバグを隠してしまういやん な機能 – 心当たりのあるフレームワーク / ライブラリ開発者 さんは直してください! ● でもその機能にスレッドセーフじゃないバグが あるので 6.0.27 以降は無効になっている – https://issues.apache.org/bugzilla/show_bug. cgi?id=48895
25.
パターン その2 java.util.
logging
26.
java.util.logging の Level ●
Level 継承するとクラスローダ がリークする ● ここ嫁 ● http://blogs.sun.com/fkieviet/entry/cl assloader_leaks_the_dreaded_java
27.
パターン その
3 既成 ライブラリ
28.
既成ライブラリ ●
元々複数のクラスローダ上で動作することを想 定していないライブラリ – ContextClassLoader や static フィールドの誤用 – ThreadLocal や WeakHashMap などの参照構造 の理解不足
29.
既成ライブラリ ●
Commons-logging – だいぶ前に一通り直ったけど、利用する側のコー ドによってはリークする ● Commons-beanutils – 1.8.0 時点で一応メジャーな問題は全部解決してい る – https://issues.apache.org/jira/browse/BEANU TILS-291 ● 他にもいっぱいあるよ!
Jetzt herunterladen