WebOTXのログ(V9以前は、"webotx_agent.log"、V10以降は、"agent.log")に
「The web application [{0}] created a ThreadLocal with key of type [{1}] (value [{2}]) and a value of type [{3}] (value [{4}]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.」
というログが出力されます。原因と対処方法を教えてください。
※可変部説明
{0}: メモリリークが発生したアプリケーションのコンテキスト名
{1}: メモリリークしたオブジェクトが登録されたThreadLocalクラス名
{2}: {1}のオブジェクト情報(toString()値)
{3}: メモリリークしたオブジェクトのクラス名
{4}: {3}のオブジェクト情報(toString()値)
●出力される原因
Webアプリケーションクラスローダでロードされるクラスのオブジェクトを、ThreadLocalに登録して削除しないままアプリケーションを停止した場合に出力されます。
そのためWebアプリケーションクラスローダが破棄されません。
●対処方法
次のパターンのいずれかで対処してください。
・パターン1
アプリケーションの実装のリクエスト処理が終わったタイミングでインスタンス{2}、インスタンス{4}を確実にThreadLocalから削除します。
WebOTXを起動したまま再配備を繰り返す運用の場合はこのパターンを選択してください。
・パターン2
アプリケーション停止時のリークのためWebOTXを起動したまま再配備を繰り返す運用でなければ無視してかまいません。
・パターン3
WebOTXを起動したまま再配備を繰り返す運用でなければリークの影響は少ないため、以下の設定でメッセージ出力を抑止できます。
ただし、メッセージ出力が抑止されるだけであり、リークが修正されるわけではありません。
・システムプロパティ
設定名:com.nec.webotx.webcontainer.EnableCheckThreadLocalsForLeaks
設定値:false
※但し、バージョンによって設定が効かない場合があります。詳細は以下のとおりです。
[V9.1以前]
メッセージ出力の抑止はできません。
[V9.11以降]
バージョンによってはメッセージ抑止のためにパッチ適用が必要です。
V9.11: V9.11.00.02以降
V9.20: V9.20.00.01以降
V9.21: V9.21.00.01以降
上記以降: パッチ適用不要
設定コマンド
[スタンダードモード、もしくはエージェントプロセス使用時]
otxadmin> create-jvm-options -Dcom.nec.webotx.webcontainer.EnableCheckThreadLocalsForLeaks=false
[アドバンスドモード、もしくはプロセスグループ使用時]
otxadmin> add-pg-javasystem-property --apgroup {アプリケーショングループ名} --javasystemprop com.nec.webotx.webcontainer.EnableCheckThreadLocalsForLeaks --value false {プロセスグループ名}
※設定後はドメインの再起動が必要です。
【対象製品】Application Server
【確認済みのバージョン】V8.4以降
【確認済みのエディション】すべて
【確認済みの対象OS】すべて
【確認済みのJavaバージョン】すべて
【コンポーネント】Webコンテナ
【カテゴリー】運用/設定