人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

●質問者: nemutaiyo
●カテゴリ:コンピュータ インターネット
✍キーワード:Java JVM Tomcat すみません オープン
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● ko8820
●27ポイント

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

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

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

解放されない。

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

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

◎質問者からの返答

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

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

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


2 ● dev_zer0
●27ポイント

#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()は絶対します。ただ、しなかった場合どうなるか知りたかったのです。

ありがとうございます。


3 ● sipadan
●26ポイント

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

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

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

資源が解放されます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ