499 :sage:2009/07/17(金) 13:14:30 http://b.hatena.ne.jp/entry/d.hatena.ne.jp/higayasuo/20090716/1247702860 の "Log4j使ってて、weavingされてるクラスでLog logger = LogFactory.getLog(getClass()); とかしてると危険なんだよね" というコメントが気になったぜ 501 :デフォルトの名無しさん:2009/07/17(金) 13:51:44 >>499 Log4JでなくCommons Logginの間違いだな LogFactory#releaseAll()呼べばおk 504 :デフォルトの名無しさん:2009/07/17(金) 16:13:21 >>499 クラスを記述するのでなくgetClass()を使うと、バイトコードエンハンスされた クラスが登録される ClassLoaderが解放されない問題は、こんな形でAOPで拡張したクラスがどっか に登録されて解放されないことによって起こりやすい SingletonS2ContainerFactory.destroy()を呼び出せば 内部でLogFactory.releaseAll()実行するのでクラスも解放される AOPを使うときは、対象となるクラスに対してgetClass()を使わないのが無難 バッドノウハウの一つ 506 :デフォルトの名無しさん:2009/07/17(金) 17:05:33 >クラスを記述するのでなくgetClass()を使うと XXX.classなら大丈夫なの?なんで? 509 :デフォルトの名無しさん:2009/07/17(金) 19:50:18 >>506 XXX.classじゃAOPで拡張されたクラスは取れない だがAOPで拡張されたクラスかどうかは重要じゃないから気にすることはない クラスがキャッシュされてるとそのクラスローダーを破棄できないことが問題 510 :デフォルトの名無しさん:2009/07/17(金) 20:39:35 >>499 からの Log4j 関連の話だが、知らなかった。 Seasar2 の Hotdeploy をつかっておらず、Spring で AOP している場合で、 Log logger = LogFactory.getLog(getClass()); とする書き方をしている場合で、 Tomcat の reloadable="true" としている場合、 再コンパイルしたら Tomcat がその web アプリをリロードするが、 こういうときも、前回の ClassLoader の破棄に失敗するの? Tomcat で reloadable="true" としているけど、 いつも10回ぐらい続けると、ParmGen の領域で OutOfMemory とか出る。 513 :デフォルトの名無しさん:2009/07/18(土) 19:23:59 >>493 バッドノウハウ普通に知られてるかぁ?