ファイル記述子をリークする Web アプリがあります。本番環境では、Java プロセスのファイル記述子の数は時間の経過とともにゆっくりと増加し、数か月後にはファイル記述子が不足します。ファイル記述子の現在の制限はかなり高く、10240 です。
Java プロセスを見ると、ファイル記述子のリストは次のようになります。
# ls -l /proc/32526/fd |wc -l
9558
# ls -l /proc/32526/fd
lr-x------ 1 userx userx 64 Apr 23 12:21 1229 -> /data/s1-js2-tier2-store6/52d/2ed/f73/1c80d154a055e5e
lr-x------ 1 userx userx 64 Apr 23 12:21 1230 -> /data/s1-js2-tier2-store6/52d/9aa/ad3/1c80d154a0688a6
lr-x------ 1 userx userx 64 Apr 23 12:21 1231 -> /data/s1-js2-tier2-store4/522/9c8/543/1c81a0c37763880
lr-x------ 1 userx userx 64 Apr 23 12:21 1232 -> /data/s1-js2-tier2-store6/52d/78c/4f3/1c80d154a06308c
lr-x------ 1 userx userx 64 Apr 23 12:21 1239 -> /data/s1-js2-tier2-store6/530/b88/753/1c80901a6d6541f (deleted)
私がやりたいことは、1 つのファイル記述子を選択し、ライブ JVM 内のオブジェクトに何らかの方法でマップして、どのオブジェクトが取り残され、ファイル記述子が添付されたオブジェクトへの参照を保持しているのかを調査できるようにすることです。
Eclipse でライブ JVM に接続したかったのですが、そのためには JVM を再起動してデバッグ ポート/パラメータを追加する必要がありますが、同じ状況が現れるまで数か月待つ必要があります。
JVMを再起動せずにそれを行うにはどうすればよいですか? この特定のケースで役立つダンプ ツールはありますか?