- PR -

Javaにおけるnullクリアについて

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2004/08/21
投稿数: 41
投稿日時: 2005-04-13 05:20
基本的な質問なんですが、javaでも処理が全て終了した後に使用した変数などをnullクリアするべきなんでしょうか?
今はリザルトセット、ステートメント、コネクション、配列などはクローズ処理、nullクリアをしています。String型などは他の型とは少し違う等といったことをどこかで見たことがあります。(曖昧ですいません)
変数を多く使用する処理を書いていてメモリーリークとかになってしまうのではと疑問に感じ投稿しました。
ご教授おねがいします。


[ メッセージ編集済み 編集者: matsu_on 編集日時 2005-04-13 05:22 ]
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-04-13 06:52
引用:
nullクリアするべきなんでしょうか?


nullクリアって何ですか?

変数に null を代入するということであればスタックに積まれる自動変数については不要。スコープからはずれれば勝手に亡くなるので。クラス(スタティック)変数については、参照しているインスタンスを使う予定がないのなら null を代入しておけば、gc での回収を期待できる。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-04-13 06:54
よほど変なプログラム(スタックに変数をつみまくるとか)書かない限りは必要ないですね。
スタックを抜ければスタックフレームごと回収されます。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-04-13 11:22
#以下は例外ケースですので、スレッドのオーナーの方は気にしないでください。
#J2EEのアプリ実装担当者のような方にとっては、ほぼ関係ない話だと思います。
#EJBやServlet内部で、下記に示すような長寿命のスタックを作成することはほぼ
#ありえない、というかあってはいけないことですので。

スタックフレームの寿命が非常に長ければ、スタック上のローカル参照は事実上
リークしますのでご注意を。

たとえば、こんなメソッドを使用することはありがちかと思いますが、
コード:

public void MainLoop(){
LargeObject lo = new LargeObject();
//loを使用した初期化
while(isAlive){
//プロセス終了までループ
}
}



このような場合、MainLoop()メソッドを抜けるまでloはGC対象に
ならないため、事実上リークしていることになります。おそらく
nullクリア都市伝説?は、このような場合に限り

コード:

public void MainLoop(){
LargeObject lo = new LargeObject();
//loを使用した初期化
lo = null;
while(isAlive){
//プロセス終了までループ
}
}



といったコードを記述して、ローカル変数loが参照していた
オブジェクトへの強参照を明示的になくすことで、上記のような
リーク現象を防止することを目的としているものかと思います。

このようなことが無い限りは、NULLクリアする必要はないでしょうね。

[ メッセージ編集済み 編集者: シュン 編集日時 2005-04-13 11:31 ]
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2005-04-13 11:41
intなどのプリミティブ型に限って言えばメソッド終了時に
ローカル変数として確保された領域は開放されますが、
メソッド内で生成したインスタンスは、メソッドの終了と同時に
参照されなくなるとは限りません。
たとえば、メソッド内で新たなインスタンスを作ってreturnで返すような
場合、メソッドの実行が終了しても呼び出し元からの参照は引き続き残ります。

メソッドのライフサイクルとインスタンスのライフサイクルは
別個の問題として考える必要があります。
未記入
常連さん
会議室デビュー日: 2004/08/21
投稿数: 41
投稿日時: 2005-04-13 17:52
ご返答ありがとうございます。
クラス変数と特殊なケースを除いては得にする必要はないということですね。
ありがとうございました。
いっさ
ベテラン
会議室デビュー日: 2005/04/18
投稿数: 83
投稿日時: 2005-04-22 15:33
ぬるぽの対処方がわかりません…。

教えて下さい。

難しい言葉が出ててわからないんで。
No鶴瓶 NoLife
常連さん
会議室デビュー日: 2005/01/28
投稿数: 48
投稿日時: 2005-04-22 15:55
>いっささんへ

あなた、確信犯でしょ?

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