6

ファイル ハンドルまたはおそらくストリームを適切に閉じていないコードベースに問題があります。最終的に、非常に重い負荷がかかると、TooManyOpenFiles 例外が発生します。lsof の出力に基づいて、リークがどこにあるか (ロギング システム内) はかなりわかっていますが、私の質問は、完了時にリソースが適切に閉じられていることを確認する単体テストを作成するにはどうすればよいかということです。JRE を照会して、現在開いているファイルの数を調べる方法はありますか? ファイル操作を傍受して監視できるようにすることはできますか?

すべてのファイル I/O を管理し、参照をカウントし、そのように閉じていることを確認するために、コードをインストルメント化する必要があると思いますが、上記のアイデアに似たトップダウンのソリューションを誰かが知っている場合、それは大きな助けになるでしょう!

4

4 に答える 4

3

テストについて話しているので、PowerMock http://code.google.com/p/powermock/でうまくいくかもしれません。私が間違っていなければ、静的メソッドとコンストラクターをモックすることが可能になります。そのため、コンストラクターや close メソッド、またはリソースを解放するために必要なものをモック/スパイすることができます。

私は自分のテストでそれを避けようとしていますが、あなたが説明した場合には、面倒な価値があるかもしれません.

于 2011-09-26T18:16:36.180 に答える
3

AspectJなどのアスペクト指向プログラミング (AOP) ツールを使用して、開いている/閉じているファイルをカウントするコードをFileInputStreamおよびに追加できますFileOutputStream。これはかなり簡単に実行できます (詳細はもちろんツールによって異なります) 堅牢で非侵襲的です。

于 2011-09-26T18:05:26.407 に答える
0

JMX経由でこれを見ることができるようです。

誰かがここにコードを投稿しました: http://java-monitor.com/forum/showthread.php?t=130

JVM で JMX を有効にしていない場合は有効にする必要があります。

于 2011-09-26T18:12:11.467 に答える