ClassLoader Leak Patterns
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

ClassLoader Leak Patterns

on

  • 9,551 views

 

Statistics

Views

Total Views
9,551
Views on SlideShare
9,184
Embed Views
367

Actions

Likes
20
Downloads
84
Comments
0

12 Embeds 367

http://yoonchulkoh.hatenablog.com 188
http://d.hatena.ne.jp 115
https://cybozulive.com 50
https://p.yammer.com 3
http://a0.twimg.com 2
https://si0.twimg.com 2
http://webcache.googleusercontent.com 2
http://twitter.com 1
http://twib.jp 1
http://translate.googleus 1
https://twitter.com 1
http://s.deeeki.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

ClassLoader Leak Patterns Presentation Transcript

  • 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 ● 他にもいっぱいあるよ!