- PR -

オブジェクトの明示的な破棄

1
投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2004/08/03
投稿数: 21
投稿日時: 2004-12-03 09:42
初めまして。ちょっとした疑問なのですが

java.lang.Objectのfinalize()メソッドでは、
このオブジェクトへの参照はもうないとガベージコレクションによって判断されたときに、ガベージコレクタによって呼び出されます。サブクラスは finalize メソッドをオーバーライドして、システムリソースを破棄したり、その他のクリーンアップを行うことができます。

とあり、FileInputStreamなどでは、finalize()をオーバーライドしてclose()メソッドを動かすようにしているようです。
なので、close()メソッドを書き忘れても、ストリームを閉じますが
インスタンスにnullを入れるとどうなるのでしょう???finalize()は実行できないのでは?と思うのですが。。。

インスタンスに明示的にnullを代入して参照を破棄するのはどうなのでしょうか?
nullを代入するとGCの対象になるから、必要なくなったオブジェクトにはnullを代入すべきなのでしょうか?



よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2004-12-03 10:21
> インスタンスに明示的にnullを代入して
> nullを代入するとGCの対象になるから、
> オブジェクトにはnullを代入すべきなのでしょうか?
言われていることがよく分かりません.
もしかして,「変数」と「インスタンス/オブジェクト」を混同されているのではないですか?
nullを代入できるのは「変数」です.
インスタンスは複数から参照されていることがあるので,特定の変数にnullを代入しても,GCの対象になるとは限りません.
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2004-12-03 10:26
ちょっと誤解してるのかもしれませんね。
FileInputStreamの参照変数にnullを代入したとしても、FileInputStreamインスタンス
そのものがnullになるわけでは無いのですよ。
例えば

コード:

String str1 = new String("hello");
String str2 = str1;
str1 = null;
System.out.println( "str1-" + str1 + " " + "str2-" + str2 );


の場合str1にnullを代入したからと言って「"hello"というデータを保持したString」
インスタンス自体が無くなる訳ではなく、きちんと参照変数str2から呼び出されます。
ただ、さらにstr2に対してもnullを代入することで「"hello"というデータを保持した
String」は何処からも参照されなくなるわけで、そうなるとこれはガーベジコレクション
の対象となります。
FileInputStreamも同じ事で、何処からも参照されなくなった場合には、ゴミとして
ガーベジコレクション候補として参照が登録され、実際に破棄段階になるとその参照に
対してfinalize()メソッドをコールし、そのあとで完全に破棄されます。
未記入
常連さん
会議室デビュー日: 2004/08/03
投稿数: 21
投稿日時: 2004-12-03 11:02
すかり勘違いしていました。
インスタンスを参照する変数にnullを代入するでした。
間違いがわかりました。ありがとうございます。

では、やはり不要になった変数にはnullを入れるようにしておいたがいいのでしょうか?


[ メッセージ編集済み 編集者: 未記入 編集日時 2004-12-03 11:04 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-03 11:12
ちなみにファイルの閉じ損ないなどは Process Explorer で確認できますよ。
・Process Explorer
http://www.sysinternals.com/ntw2k/freeware/procexp.shtml

閉じ損ないすぎて Too Many Open Files とか発生するようでしたら以下のドキュメントが役にたつかもしれません。
・BEA Support Patterns -> Too Many Open Files
http://support.bea.com/support_news/product_troubleshooting/product_troubleshooting.jsp
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-12-03 12:43
引用:

やはり不要になった変数にはnullを入れるようにしておいたがいいのでしょうか?



nullを代入しなければいけないのは、変数のスコープが広すぎるためで、
出来る限り、狭いスコープで使用するようにリファクタすべきというのをどこかで読みました。

#確かマーチンファウラーのBlikiだったかな
techbits
会議室デビュー日: 2005/05/02
投稿数: 8
投稿日時: 2005-05-02 03:53
把握できないほどデカイクラスになったら
使い終わった変数にnullを入れておくのもいいかもしれませんね。
間違って使用したときも、前に使ったごみデータが使われず、ぬるぽがでるので意味不明なバグに悩まされることはなくなりますね。

でもおれだったら、頭の中だけで変数が管理できなくなるほどクラスがでかくなったら、設計自体をみなおしますけどね。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2005-05-02 11:34
感動しました!

引用:

インギさんの書き込み (2004-12-03 11:12) より:
ちなみにファイルの閉じ損ないなどは Process Explorer で確認できますよ。
・Process Explorer
http://www.sysinternals.com/ntw2k/freeware/procexp.shtml



素晴らしいです!
こんなに便利なツールがあるとは知りませんでした。ハッカー必携ですね。
1

スキルアップ/キャリアアップ(JOB@IT)