Submit Search
Upload
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
•
Download as PPTX, PDF
•
18 likes
•
23,250 views
Norito Agetsuma
Follow
第十回 渋谷JavaのLTスライドです。
Read less
Read more
Software
Report
Share
Report
Share
1 of 24
Download now
Recommended
Metaspace
Metaspace
Yasumasa Suenaga
ClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Yuji Kubota
スレッドダンプの読み方
スレッドダンプの読み方
Funato Takashi
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方
Takahiro YAMADA
Recommended
Metaspace
Metaspace
Yasumasa Suenaga
ClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Yuji Kubota
スレッドダンプの読み方
スレッドダンプの読み方
Funato Takashi
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方
Takahiro YAMADA
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Norito Agetsuma
使ってみよう!JDK Flight Recorder
使ってみよう!JDK Flight Recorder
Yoshiro Tokumasu
Jvm internal
Jvm internal
Go Tanaka
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VM
yy yank
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo!デベロッパーネットワーク
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
Unified JVM Logging
Unified JVM Logging
Yuji Kubota
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門
tsukasamannen
Java によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けて
Shigeru Tatsuta
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
Hironobu Isoda
第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える
chonaso
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
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
Takahiro YAMADA
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
歩 柴田
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
JustSystems Corporation
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
Taku Miyakawa
Mavenの真実とウソ
Mavenの真実とウソ
Yoshitaka Kawashima
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
Yoshiharu Hashimoto
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
Yuji Kubota
More Related Content
What's hot
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Norito Agetsuma
使ってみよう!JDK Flight Recorder
使ってみよう!JDK Flight Recorder
Yoshiro Tokumasu
Jvm internal
Jvm internal
Go Tanaka
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VM
yy yank
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo!デベロッパーネットワーク
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
Unified JVM Logging
Unified JVM Logging
Yuji Kubota
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門
tsukasamannen
Java によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けて
Shigeru Tatsuta
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
Hironobu Isoda
第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える
chonaso
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
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
Takahiro YAMADA
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
歩 柴田
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
JustSystems Corporation
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
Taku Miyakawa
Mavenの真実とウソ
Mavenの真実とウソ
Yoshitaka Kawashima
What's hot
(20)
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Javaトラブルに備えよう #jjug_ccc #ccc_h2
使ってみよう!JDK Flight Recorder
使ってみよう!JDK Flight Recorder
Jvm internal
Jvm internal
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VM
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
Unified JVM Logging
Unified JVM Logging
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門
Java によるクラウドネイティブ の実現に向けて
Java によるクラウドネイティブ の実現に向けて
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
Mavenの真実とウソ
Mavenの真実とウソ
Similar to 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 + サーバサイドレンダリング
エンジニア勉強会 エスキュービズム
Similar to 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 + サーバサイドレンダリング
More from 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
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
More from Norito Agetsuma
(14)
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
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
Download now