3

Javaプログラミングからファイルを作成し、Apache Commons Logging API、特にLog4j実装を使用して一部のデータをログに記録しています。

ロギングが完了した後、Logクラスへの参照をnullとして設定しています。ログに記録しているファイルを削除しようとすると、File.delete()はfalseを返します。

デバッグ中(File.delete()が呼び出される直前)にWindowsエクスプローラーからファイルを削除すると、「削除できません:別のプログラムによって使用されています」という通知が表示されます。

私のコードからのファイルに開いている依存関係はありません(すべてのストリームが閉じています)。ファイルにアクセスできる唯一のオブジェクトはLogオブジェクトであり、File.delete()を呼び出す前にnullに設定しました。

とにかく、ファイルリソースへの参照を保持している特定のオブジェクトを確認できますか?nullに設定する以外に、Logオブジェクトにリソースを解放させる他の方法はありますか?ファイルを強制的に削除できますか?

4

2 に答える 2

5

変数をnullに設定するだけでは、オブジェクトはガベージコレクションされません。また、ある種の静的マップに登録されている可能性があります。実装を確認する必要があります。(一部のバージョンは弱参照を使用していると思いますが、他のバージョンは使用していません。)

その時にファイルを削除しなければならない理由はありますか?を試してみることをお勧めしFile.deleteOnExit()ます。これにより、ファイルが削除される可能性が高くなります。ただし、タイミングによって異なります。(また、繰り返し呼び出す場合は、メモリリークが発生する可能性があることに注意してください。)deleteOnExit

アプリケーションが終了した後、またはおそらく次の起動時にファイルを削除できますか?

または、ファイルをロールオーバーするログ実装を使用できますか?ロールオーバーを強制してから、古いファイルを削除してみてください。

于 2011-03-23T06:58:07.437 に答える
3

あなたの場合、ロガーはそれをファイルに書き込んでいます-ファイルは別のプロセスによってロックされています。


更新:

問題は、log4jsのアペンダーがファイルに書き込みロックを持っていることです。したがって、アペンダーが閉じられていない間は、ファイルを削除することはできません。解決策は、より小さなファイルを生成するか、追加フラグをfalseに設定して、サーバーを再起動すると、古いログファイルが自動的に削除されるようにすることです。

使ってみてください

org.apache.log4j.LogManager.shutdown();

シャットダウンすると、ログファイルを使用しているすべてのプロセスが終了し、この方法で問題が解決したことを確認してください。

close()getAllAppenders()からアペンダーを適切に閉じるように、必ず独自のAppender実装(AppenderSkeletonのサブクラス)のメソッドを呼び出してください。

于 2011-03-23T06:57:10.280 に答える