- - PR -
オブジェクトの明示的な破棄
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-12-03 09:42
初めまして。ちょっとした疑問なのですが
java.lang.Objectのfinalize()メソッドでは、 このオブジェクトへの参照はもうないとガベージコレクションによって判断されたときに、ガベージコレクタによって呼び出されます。サブクラスは finalize メソッドをオーバーライドして、システムリソースを破棄したり、その他のクリーンアップを行うことができます。 とあり、FileInputStreamなどでは、finalize()をオーバーライドしてclose()メソッドを動かすようにしているようです。 なので、close()メソッドを書き忘れても、ストリームを閉じますが インスタンスにnullを入れるとどうなるのでしょう???finalize()は実行できないのでは?と思うのですが。。。 インスタンスに明示的にnullを代入して参照を破棄するのはどうなのでしょうか? nullを代入するとGCの対象になるから、必要なくなったオブジェクトにはnullを代入すべきなのでしょうか? | ||||
|
投稿日時: 2004-12-03 10:21
> インスタンスに明示的にnullを代入して
> nullを代入するとGCの対象になるから、 > オブジェクトにはnullを代入すべきなのでしょうか? 言われていることがよく分かりません. もしかして,「変数」と「インスタンス/オブジェクト」を混同されているのではないですか? nullを代入できるのは「変数」です. インスタンスは複数から参照されていることがあるので,特定の変数にnullを代入しても,GCの対象になるとは限りません. | ||||
|
投稿日時: 2004-12-03 10:26
ちょっと誤解してるのかもしれませんね。
FileInputStreamの参照変数にnullを代入したとしても、FileInputStreamインスタンス そのものがnullになるわけでは無いのですよ。 例えば
の場合str1にnullを代入したからと言って「"hello"というデータを保持したString」 インスタンス自体が無くなる訳ではなく、きちんと参照変数str2から呼び出されます。 ただ、さらにstr2に対してもnullを代入することで「"hello"というデータを保持した String」は何処からも参照されなくなるわけで、そうなるとこれはガーベジコレクション の対象となります。 FileInputStreamも同じ事で、何処からも参照されなくなった場合には、ゴミとして ガーベジコレクション候補として参照が登録され、実際に破棄段階になるとその参照に 対してfinalize()メソッドをコールし、そのあとで完全に破棄されます。 | ||||
|
投稿日時: 2004-12-03 11:02
すかり勘違いしていました。
インスタンスを参照する変数にnullを代入するでした。 間違いがわかりました。ありがとうございます。 では、やはり不要になった変数にはnullを入れるようにしておいたがいいのでしょうか? [ メッセージ編集済み 編集者: 未記入 編集日時 2004-12-03 11:04 ] | ||||
|
投稿日時: 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 | ||||
|
投稿日時: 2004-12-03 12:43
nullを代入しなければいけないのは、変数のスコープが広すぎるためで、 出来る限り、狭いスコープで使用するようにリファクタすべきというのをどこかで読みました。 #確かマーチンファウラーのBlikiだったかな | ||||
|
投稿日時: 2005-05-02 03:53
把握できないほどデカイクラスになったら
使い終わった変数にnullを入れておくのもいいかもしれませんね。 間違って使用したときも、前に使ったごみデータが使われず、ぬるぽがでるので意味不明なバグに悩まされることはなくなりますね。 でもおれだったら、頭の中だけで変数が管理できなくなるほどクラスがでかくなったら、設計自体をみなおしますけどね。 | ||||
|
投稿日時: 2005-05-02 11:34
感動しました!
素晴らしいです! こんなに便利なツールがあるとは知りませんでした。ハッカー必携ですね。 |
1