JavaのInputStreamのcloseについて質問です。


InputStreamで、ファイルをオープンした後、
closeメソッドを実行しない場合、システムリソースは、どのタイミングで解放されますか?

closeメソッドを実行しないと永遠に残る? または、JVMの判断で解放されることもあるのか? Tomcatを再起動したタイミングのみ解放されるのか?

すみませんが、よろしくお願いします。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2010/03/31 15:55:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:ko8820 No.1

回答回数1221ベストアンサー獲得回数69

ポイント27pt

>closeメソッドを実行しないと永遠に残る?

永遠に残ります。メモリーリークしてメモリーが減っていきますよ。

>または、JVMの判断で解放されることもあるのか?

解放されない。

>Tomcatを再起動したタイミングのみ解放されるのか?

Java VMが再起動したタイミングで、解放されます。

id:nemutaiyo

ko8820さん。ありがとうございます。大変参考になりました。

この質問は、Javaの基本的なことだと思うのですが、私の理解が不足しておりました。

再度、勉強したいので、参考になるサイトがあれば教えてください。(JVMで解放されるかも。と思っていましたので、「解放されない」仕様が書かれていると助かります)

2010/03/24 16:38:26
id:dev_zer0 No.2

回答回数332ベストアンサー獲得回数25

ポイント27pt

#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()すべきです。

id:nemutaiyo

「GCによって破棄すべきと判断されたときにclose()」。了解しました。

finalizeメソッドは、GCされるときに、JVMが実行するもので、私がfinalizeメソッドを使用する必要は無い。ということですね。

>

>自分が必要無くなったときに明示的にclose()すべきです。

おっしゃるとおりです。close()は絶対します。ただ、しなかった場合どうなるか知りたかったのです。

ありがとうございます。

2010/03/24 18:36:23
id:sipadan No.3

回答回数1ベストアンサー獲得回数0

ポイント26pt

FileInputStream#finalize()の延長上でもclose()が呼ばれます。

明示的にclose()を実行しなかった場合、

何回かガーベジコレクションを実行したあとにfinalize()が呼ばれ、

資源が解放されます。

  • id:ko8820
    「GCによって破棄すべきと判断されたときにclose()」は間違いないですが
    変数の参照t違って、通常、GCによって破棄すべきと判断できないので、
    事実上、closeされません。

    GC対象に出来るのなら、明示的にcloseメソッドを用意されません。
  • id:dev_zer0
    > 変数の参照t違って、通常、GCによって破棄すべきと判断できないので、
    > 事実上、closeされません。
    GCはそのオブジェクトがシステムリソースを保持しているかどうかなど判断できません
    GCは誰からも参照されないオブジェクトが存在する場合、finalize()を呼び出します
     
    http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Object.html#finalize()
    ま、JDKのソースを見れば一目瞭然ですが、FileInputStream#finalize()でclose()しています
    具体的には、FileInputStream#finalize()は下記の処理を行います。
     
    protected void finalize() throws IOException {
     if (fd != null) {
      if (fd != fd.in) {
       close();
      }
     }
    }
     
    > GC対象に出来るのなら、明示的にcloseメソッドを用意されません。
    必要無いのにシステムリソースを確保し続けるプログラムは行儀が悪いです。
    そして、FileInputStreamクラスはうっかりclose()を忘れた
    マヌケなプログラマがいてもclose()するように設計されています。
     
    自分が明示的に確保したシステムリソースは自分が必要無くなったときに解放すべきです
    繰り返しますが、それはclose()をさぼって良い理由にはなりません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません