Soumettre la recherche
Mettre en ligne
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
•
Télécharger en tant que PPTX, PDF
•
18 j'aime
•
23,260 vues
Norito Agetsuma
Suivre
第十回 渋谷JavaのLTスライドです。
Lire moins
Lire la suite
Logiciels
Signaler
Partager
Signaler
Partager
1 sur 24
Télécharger maintenant
Recommandé
ClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
クラスローダーについて
クラスローダーについて
Suguru ARAKAWA
java.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷java
Yuji Kubota
Java 9で進化する診断ツール
Java 9で進化する診断ツール
Yasumasa Suenaga
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Yuji Kubota
OpenJDK トラブルシューティング #javacasual
OpenJDK トラブルシューティング #javacasual
Yuji Kubota
Metaspace
Metaspace
Yasumasa Suenaga
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
Recommandé
ClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
クラスローダーについて
クラスローダーについて
Suguru ARAKAWA
java.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷java
Yuji Kubota
Java 9で進化する診断ツール
Java 9で進化する診断ツール
Yasumasa Suenaga
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Yuji Kubota
OpenJDK トラブルシューティング #javacasual
OpenJDK トラブルシューティング #javacasual
Yuji Kubota
Metaspace
Metaspace
Yasumasa Suenaga
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
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
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
Docker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
NTT DATA Technology & Innovation
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
NTT DATA Technology & Innovation
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
Takahiro YAMADA
TDD のこころ
TDD のこころ
Takuto Wada
ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介
JustSystems Corporation
会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと
Recruit Technologies
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
JustSystems Corporation
Unified JVM Logging
Unified JVM Logging
Yuji Kubota
jcmd #javacasual
jcmd #javacasual
Yuji Kubota
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
健人 井関
Spring と TDD
Spring と TDD
Takeshi Ogawa
MQTTとAMQPと.NET
MQTTとAMQPと.NET
terurou
スレッドダンプの読み方
スレッドダンプの読み方
Funato Takashi
Serverless時代のJavaについて
Serverless時代のJavaについて
Amazon Web Services Japan
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
Yoshiharu Hashimoto
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
Yuji Kubota
Contenu connexe
Tendances
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
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
Docker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
NTT DATA Technology & Innovation
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
NTT DATA Technology & Innovation
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
Takahiro YAMADA
TDD のこころ
TDD のこころ
Takuto Wada
ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介
JustSystems Corporation
会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと
Recruit Technologies
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
JustSystems Corporation
Unified JVM Logging
Unified JVM Logging
Yuji Kubota
jcmd #javacasual
jcmd #javacasual
Yuji Kubota
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
健人 井関
Spring と TDD
Spring と TDD
Takeshi Ogawa
MQTTとAMQPと.NET
MQTTとAMQPと.NET
terurou
スレッドダンプの読み方
スレッドダンプの読み方
Funato Takashi
Serverless時代のJavaについて
Serverless時代のJavaについて
Amazon Web Services Japan
Tendances
(20)
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
Docker Tokyo
Docker Tokyo
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
TDD のこころ
TDD のこころ
ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介
会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Unified JVM Logging
Unified JVM Logging
jcmd #javacasual
jcmd #javacasual
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
Spring と TDD
Spring と TDD
MQTTとAMQPと.NET
MQTTとAMQPと.NET
スレッドダンプの読み方
スレッドダンプの読み方
Serverless時代のJavaについて
Serverless時代のJavaについて
Similaire à Tomcatの実装から学ぶクラスローダリーク #渋谷Java
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
Yoshiharu Hashimoto
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
Yuji Kubota
Java-Virtual-Thread-LT.pdf
Java-Virtual-Thread-LT.pdf
Yoshio Terada
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
David Buck
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
Takahiro YAMADA
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)
torutk
Quarkus入門
Quarkus入門
Norito Agetsuma
Public 20100828 j_ruby_kaigi_10things_jror_with_javaee
Public 20100828 j_ruby_kaigi_10things_jror_with_javaee
Yoshiharu Hashimoto
Play jjug2012spring
Play jjug2012spring
Takafumi Ikeda
Introduction to GraalVM
Introduction to GraalVM
Koichi Sakata
JVMの中身を可視化してみた
JVMの中身を可視化してみた
Kengo Toda
Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!
YujiSoftware
120517 revert tomcat7
120517 revert tomcat7
Takayoshi Tanaka
React + Flux
React + Flux
_yukikayuki
R5 3 type annotation
R5 3 type annotation
EIICHI KIMURA
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
Akio Katayama
Hello Java
Hello Java
Chihiro Ito
Inside frogc in Dart
Inside frogc in Dart
Goro Fuji
JavaFX & GlassFish 勉強会 Project Visage
JavaFX & GlassFish 勉強会 Project Visage
Yuichi Sakuraba
React Redux Redux-Saga + サーバサイドレンダリング
React Redux Redux-Saga + サーバサイドレンダリング
エンジニア勉強会 エスキュービズム
Similaire à Tomcatの実装から学ぶクラスローダリーク #渋谷Java
(20)
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
Java-Virtual-Thread-LT.pdf
Java-Virtual-Thread-LT.pdf
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)
Quarkus入門
Quarkus入門
Public 20100828 j_ruby_kaigi_10things_jror_with_javaee
Public 20100828 j_ruby_kaigi_10things_jror_with_javaee
Play jjug2012spring
Play jjug2012spring
Introduction to GraalVM
Introduction to GraalVM
JVMの中身を可視化してみた
JVMの中身を可視化してみた
Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!
120517 revert tomcat7
120517 revert tomcat7
React + Flux
React + Flux
R5 3 type annotation
R5 3 type annotation
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
Hello Java
Hello Java
Inside frogc in Dart
Inside frogc in Dart
JavaFX & GlassFish 勉強会 Project Visage
JavaFX & GlassFish 勉強会 Project Visage
React Redux Redux-Saga + サーバサイドレンダリング
React Redux Redux-Saga + サーバサイドレンダリング
Plus de Norito Agetsuma
Java EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfile
Norito Agetsuma
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
Norito Agetsuma
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
Norito Agetsuma
Java EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jp
Norito Agetsuma
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
Norito Agetsuma
Java EE8 Report
Java EE8 Report
Norito Agetsuma
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Norito Agetsuma
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
Norito Agetsuma
JJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめよう
Norito Agetsuma
AeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュ
Norito Agetsuma
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメ
Norito Agetsuma
SQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメ
Norito Agetsuma
JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”
Norito Agetsuma
Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点)
Norito Agetsuma
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdi
Norito Agetsuma
Plus de Norito Agetsuma
(15)
Java EEを補完する仕様 MicroProfile
Java EEを補完する仕様 MicroProfile
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
Java EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jp
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
Java EE8 Report
Java EE8 Report
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
JJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめよう
AeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュ
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメ
SQLアンチパターン読書会 レジュメ
SQLアンチパターン読書会 レジュメ
JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”
Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点)
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdi
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
1.
Tomcatの実装から学ぶ ClassLoaderLeak @n-agetsu 上妻 宜人 (あげつま
のりと) 第十回 #渋谷java
2.
第十回 #渋谷java あげつま のりと •
SIer勤務 • Javaトラブルシューティング • JBoss, Tomcat 社内サポート • はてな 見習いプログラミング日記 • Software Design 2014 10月号 寄稿
3.
第十回 #渋谷java ClassLoaderLeakって?
4.
第十回 #渋谷java ホットデプロイ時に古いクラスローダが GCされない困った不具合です (〜JDK7) java.lang.OutOfMemoryError
: Perm Gen (JDK8〜) Metaspaceの増大/OutOfMemoryError (-XX:MaxMetaSpaceSize設定時)
5.
第十回 #渋谷java ホットデプロイの普及により 遭遇率があがっています OOM! .war deploy deploy deploy .war
6.
第十回 #渋谷javahttp://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Edit-clear_mirrored.svg/120px-Edit-clear_mirrored.svg.png 【NEW】 test.war 【OLD】 test.war TomcatはClassLoaderLeakの 検知・解放機能を実装しています。 参考: O’Reilly Japan
詳解Tomcat
7.
第十回 #渋谷java Tomcat リーク検知実装コードを読む (org.apache.catalina.loader.WebappClassLoaderBase) 何をするとリークするかわかる
8.
第十回 #渋谷java Common クラスローダ Webapp クラスローダ ( 稼働中WAR) アンデプロイ済 Webapp クラスローダ ClassLoaderLeakの主な原因 Bootstrap クラスローダ System クラスローダ
Tomcat スレッドプール 1. 上位クラスローダで読み込まれた クラスからの強参照 例 : java.sql.DriverManagerのフィールド変数 ⇒ WEB-INF/libのJDBCドライバ など 2. プール内スレッドからの参照 ・ スタック中スレッドが旧APクラスを参照 ・ ThredLocal.remove() の漏れ Tomcat8のデフォルトの クラスローダ階層 (クラスローダについては以下参照) org.apache.catalina.startup.Bootstrap.initメソッド と org.apache.catalina.loader.WebappLoaderクラス
9.
第十回 #渋谷java Common クラスローダ Webapp クラスローダ ( 稼働中WAR) アンデプロイ済 Webapp クラスローダ ClassLoaderLeakの主な原因 Bootstrap クラスローダ System クラスローダ
Tomcat スレッドプール 1. 上位クラスローダで読み込まれた クラスからの強参照 例 : java.sql.DriverManagerのフィールド変数 ⇒ WEB-INF/libのJDBCドライバ など 2. プール内スレッドからの参照 ・ スタック中スレッドが旧APクラスを参照 ・ ThredLocal.remove() の漏れ Tomcat8のデフォルトの クラスローダ階層 (クラスローダについては以下参照) org.apache.catalina.startup.Bootstrap.initメソッド と org.apache.catalina.loader.WebappLoaderクラス JDKクラス、Tomcatスレッドプール など アンデプロイしても使われるクラスから、 アンデプロイ済APへの参照が残るのが共通点
10.
第十回 #渋谷java Tomcatが検知するClassLoaderLeak • java.lang.ThreadLocal.remove
漏れ • java.sql.DriverManager.deregisterDriver 漏れ • その他 • RMI関連 sun.rmi.transport.ObjectTable のobjTable, implTable クリア漏れ • 実行中スレッドによる参照 • java.beans.Introspector.flushCaches() の実行漏れ • Commons HttpClient の keep alive 用スレッドが残り続ける • java.util.Timer.cancel() キャンセル漏れ • 古いJVM? のGCバグ static / final 変数解放漏れ (JDK7, 8では再現せず) org.apache.catalina.loader.WebappClassLoaderBase クラスを読んでみると..
11.
第十回 #渋谷java ThreadLocal.remove 実行漏れ public
class UserThreadContext { private static ThreadLocal<User> context = ...; public static void setUser(User user) { userContext.set(user); } } 掃除されてないスレッドローカル
12.
第十回 #渋谷java ThreadLocal.remove 実行漏れ public
class UserThreadContext { private static ThreadLocal<User> context = ...; public static void setUser(User user) { userContext.set(user); } // filterとかinterceptorとかでリクエスト終了までに実行 public static void cleanup() { userContext.remove(); } } データは入れたら消す。cleanupコードの追加。
13.
第十回 #渋谷java なぜremove漏れでリークする? ThreadLocalに ユーザ情報を追加 HTTPリクエスト Tomcatスレッドプール ThreadLocalMap Entry User プールに戻ったスレッドが持つThreadLocalMapから アプリケーションへの参照が残り続ける ThreadLocalMap Entry User
14.
第十回 #渋谷java なぜremove漏れでリークする? ThreadLocalに ユーザ情報を追加 HTTPリクエスト Tomcatスレッドプール ThreadLocalMap Entry UserTomcatの場合、アンデプロイ時に プールのチェック・リフレッシュにより、 ThreadLocalによるリークを検知・解放 解放: ThreadPoolExecutor.setCorePoolSize(0); (プースサイズを0にしてidleを全て解放)
15.
第十回 #渋谷java DriverManager.deregisterDriver 漏れ .war
のWEB-INF/libにJDBCドライバを含めて以下コードで再現 @WebServlet(“/leak”) public class LeakServlet extends HttpServlet { @Override public void doGet(...) { try { Class.forName(“org.postgresql.Driver”); } catch (ClassNot.. e) { ... } } }
16.
第十回 #渋谷java JDBCクラスロード時にDriverManagerに登録 import org.postgresql; public
class Driver implements java.sql.Driver { static { try { java.sql.DriverManager.registerDriver(new Driver()); .... Common Webapp Undeployed WEB-INF/lib/xxxJDBC.jar Bootstrap System DriverManager • .war にJDBCに含めた場合、参照が残る。 • tomcat/libに置いた場合は、ドライバが Commonでクラスロードされるので残らない。
17.
第十回 #渋谷java DriverManagerによるリークの対処 • JDBCドライバを.warに含めない •
ServletContextListenerでAP終了時に解放 • java.sql.DriverManager.deregisterDriver実行 • Tomcat8ではデフォルトで検知・解放が有効 • JREMemoryLeakPreventionListenerで解放される
18.
第十回 #渋谷java どうやってClassLoaderLeakを 解析するか?
19.
第十回 #渋谷java ClassLoaderLeakの見つけ方 1. HeapDump取得 jcmd
<pid> GC.heapdump filename=... 2. Eclipse Memory Analyzer ロードしたら “Duplicate Classes”
20.
第十回 #渋谷java ClassLoaderLeakの見つけ方 同じクラスが複数のWebappClassLoaderから ロードされていればClassLoaderLeakの可能性大
21.
第十回 #渋谷java Path To
GC Roots で原因を特定 TomcatのTaskThreadが持つThreadLocalからの参照が原因 GCして欲しいWebappClassLoaderを 選択してGCルートをチェック
22.
第十回 #渋谷java ライブラリによるClassLoaderLeak • 伝統的なライブラリにあるClassLoaderLeak •
Commons Logging 1.0.4 以前 • iBATIS 2.3.4 以前 (iBATIS-540) • log4j 1.2.16 以前 (Bug 50486, MDC利用時のみ) • その他 • ClassLoader, ThreadLocal, HotDeploy Leak で検索
23.
第十回 #渋谷java ClassLoaderLeakはTomcatだけではない • WebLogicServer
や WildFly でも起こり得る (JVM起動中に動的にクラスローダの生成・破棄があれば起こる可能性有) • 個人的にはWebLogicServerで何度か遭遇 • プロダクション再デプロイメントの使用を意図 • WebLogicは悪くない, 前述の AP or ライブラリ起因でリーク
24.
第十回 #渋谷java まとめ • ClassLoaderLeakはホットデプロイにより顕在化 •
Tomcatは色々なClassLoaderLeakの検知・解放が可能 • 原因はThreadLocal解放漏れを筆頭に多種多様 • ClassLoaderLeakは怖くない • ヒープダンプより比較的簡単に原因特定が可能 • Duplicate Class => Path to GC Roots
Télécharger maintenant