InputStreamで、ファイルをオープンした後、
closeメソッドを実行しない場合、システムリソースは、どのタイミングで解放されますか?
closeメソッドを実行しないと永遠に残る? または、JVMの判断で解放されることもあるのか? Tomcatを再起動したタイミングのみ解放されるのか?
すみませんが、よろしくお願いします。
>closeメソッドを実行しないと永遠に残る?
永遠に残ります。メモリーリークしてメモリーが減っていきますよ。
>または、JVMの判断で解放されることもあるのか?
解放されない。
>Tomcatを再起動したタイミングのみ解放されるのか?
Java VMが再起動したタイミングで、解放されます。
#1の回答は嘘です。
Java6(少なくともJava1.4以上のバージョン)では
FileInputStream#finalize()のJavaDocに以下の記載があります。
http://java.sun.com/javase/ja/6/docs/ja/api/java/io/FileInputStr...
ファイル入力ストリームへの参照が存在しなくなったときに、このストリームの close メソッドが確実に呼び出されるようにします。
よって、GCによって破棄すべきと判断されたときにclose()されます。
# 無論、何時GCされるかはそのJVMの実装によります。
ただし、それはclose()メソッドをさぼって良い理由にはなりません。
自分が必要無くなったときに明示的にclose()すべきです。
「GCによって破棄すべきと判断されたときにclose()」。了解しました。
finalizeメソッドは、GCされるときに、JVMが実行するもので、私がfinalizeメソッドを使用する必要は無い。ということですね。
>
>自分が必要無くなったときに明示的にclose()すべきです。
おっしゃるとおりです。close()は絶対します。ただ、しなかった場合どうなるか知りたかったのです。
ありがとうございます。
FileInputStream#finalize()の延長上でもclose()が呼ばれます。
明示的にclose()を実行しなかった場合、
何回かガーベジコレクションを実行したあとにfinalize()が呼ばれ、
資源が解放されます。
ko8820さん。ありがとうございます。大変参考になりました。
この質問は、Javaの基本的なことだと思うのですが、私の理解が不足しておりました。
再度、勉強したいので、参考になるサイトがあれば教えてください。(JVMで解放されるかも。と思っていましたので、「解放されない」仕様が書かれていると助かります)