More Related Content
Similar to ClassLoader Leak Patterns
Similar to ClassLoader Leak Patterns (20)
ClassLoader Leak Patterns
- 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());
- 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;
}
}
}
- 23. ThreadLocal まとめ
● 設定した値は Thread から強参照される
● ThreadLocal に渡す「値」の参照関係に注意
● スレッドのコントロールが自分に無い環境では
Thread の開放に伴う ThreadLocal の開放は
期待できない
– アプリケーションサーバ上では当然スレッドは
プールされている
– リークしないのは「入れたら確実に消す ( 一時的な
利用 ) 」か「入れっぱなしでも値の参照関係が安
全だと保証できる」場合のみ
- 24. ThreadLocal と Tomcat
● Tomcat はアンデプロイ時に ThreadLocal を
リフレクションで開放してくれる機能がある
– アプリケーションやフレームワーク、ライブラリ
のクラスローダリークバグを隠してしまういやん
な機能
– 心当たりのあるフレームワーク / ライブラリ開発者
さんは直してください!
● でもその機能にスレッドセーフじゃないバグが
あるので 6.0.27 以降は無効になっている
– https://issues.apache.org/bugzilla/show_bug.
cgi?id=48895
- 26. java.util.logging の Level
● Level 継承するとクラスローダ
がリークする
● ここ嫁
● http://blogs.sun.com/fkieviet/entry/cl
assloader_leaks_the_dreaded_java
- 28. 既成ライブラリ
● 元々複数のクラスローダ上で動作することを想
定していないライブラリ
– ContextClassLoader や static フィールドの誤用
– ThreadLocal や WeakHashMap などの参照構造
の理解不足
- 29. 既成ライブラリ
● Commons-logging
– だいぶ前に一通り直ったけど、利用する側のコー
ドによってはリークする
● Commons-beanutils
– 1.8.0 時点で一応メジャーな問題は全部解決してい
る
– https://issues.apache.org/jira/browse/BEANU
TILS-291
● 他にもいっぱいあるよ!