- - PR -
Javaにおけるnullクリアについて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-04-13 05:20
基本的な質問なんですが、javaでも処理が全て終了した後に使用した変数などをnullクリアするべきなんでしょうか?
今はリザルトセット、ステートメント、コネクション、配列などはクローズ処理、nullクリアをしています。String型などは他の型とは少し違う等といったことをどこかで見たことがあります。(曖昧ですいません) 変数を多く使用する処理を書いていてメモリーリークとかになってしまうのではと疑問に感じ投稿しました。 ご教授おねがいします。 [ メッセージ編集済み 編集者: matsu_on 編集日時 2005-04-13 05:22 ] | ||||||||
|
投稿日時: 2005-04-13 06:52
nullクリアって何ですか? 変数に null を代入するということであればスタックに積まれる自動変数については不要。スコープからはずれれば勝手に亡くなるので。クラス(スタティック)変数については、参照しているインスタンスを使う予定がないのなら null を代入しておけば、gc での回収を期待できる。 | ||||||||
|
投稿日時: 2005-04-13 06:54
よほど変なプログラム(スタックに変数をつみまくるとか)書かない限りは必要ないですね。
スタックを抜ければスタックフレームごと回収されます。 | ||||||||
|
投稿日時: 2005-04-13 11:22
#以下は例外ケースですので、スレッドのオーナーの方は気にしないでください。
#J2EEのアプリ実装担当者のような方にとっては、ほぼ関係ない話だと思います。 #EJBやServlet内部で、下記に示すような長寿命のスタックを作成することはほぼ #ありえない、というかあってはいけないことですので。 スタックフレームの寿命が非常に長ければ、スタック上のローカル参照は事実上 リークしますのでご注意を。 たとえば、こんなメソッドを使用することはありがちかと思いますが、
このような場合、MainLoop()メソッドを抜けるまでloはGC対象に ならないため、事実上リークしていることになります。おそらく nullクリア都市伝説?は、このような場合に限り
といったコードを記述して、ローカル変数loが参照していた オブジェクトへの強参照を明示的になくすことで、上記のような リーク現象を防止することを目的としているものかと思います。 このようなことが無い限りは、NULLクリアする必要はないでしょうね。 [ メッセージ編集済み 編集者: シュン 編集日時 2005-04-13 11:31 ] | ||||||||
|
投稿日時: 2005-04-13 11:41
intなどのプリミティブ型に限って言えばメソッド終了時に
ローカル変数として確保された領域は開放されますが、 メソッド内で生成したインスタンスは、メソッドの終了と同時に 参照されなくなるとは限りません。 たとえば、メソッド内で新たなインスタンスを作ってreturnで返すような 場合、メソッドの実行が終了しても呼び出し元からの参照は引き続き残ります。 メソッドのライフサイクルとインスタンスのライフサイクルは 別個の問題として考える必要があります。 | ||||||||
|
投稿日時: 2005-04-13 17:52
ご返答ありがとうございます。
クラス変数と特殊なケースを除いては得にする必要はないということですね。 ありがとうございました。 | ||||||||
|
投稿日時: 2005-04-22 15:33
ぬるぽの対処方がわかりません…。
教えて下さい。 難しい言葉が出ててわからないんで。 | ||||||||
|
投稿日時: 2005-04-22 15:55
>いっささんへ
あなた、確信犯でしょ? |