13

次のようなシナリオがあります。

public void processData(String name,String value) {

/* line 1 */    MyDTO dto = new MyDTO();  
/* line 2 */    dto.setName(name);
/* line 3 */    dto.setValue(value);
/* line 4 */    sendThroughJMSChannel(dto);
/* line 5 */    dto = null; //As a best practice, should I do this ?

}

4行目以降の私のプログラムではdto、それ以上の処理は必要ありません。ベスト プラクティスとして、5 行目のように設定dtoするか、無視する必要がありますか?null

に設定することでnull、高速なガベージ コレクションを期待しています。それが正しいか?

4

3 に答える 3

28

いいえ、ローカル変数をに設定nullして、GCによる収集を早めないでください。コンパイラは、ユーザーの助けがなくてもそれを理解できるほど賢いです。割り当てによって、nullコードが汚れて見えるだけになります。

非ローカルは別の話です。必要以上に長く存在する可能性のあるメンバー変数がある場合は、それを設定して、長引くメモリリークnullを防ぐことをお勧めします。

于 2012-12-27T17:44:42.017 に答える
14

4行目以降(メソッド呼び出しが終了すると)はスコープ外になるため、この場合は必要ありません

于 2012-12-27T17:43:12.157 に答える
1

すでに述べたように、コンパイラはローカル スコープに対して十分にスマートですが、非ローカル スコープでは、よりコンテキスト固有です。特定の時点で参照を無効にすることがどれほど正当であるかを理解する必要があります。HashMap を使用する場合に言う -

Map<String, Object> entry = new HashMap<String, Object>();
String name = "test";             
Object o = new Object();          
entry.put(name, o);                

o = null; 
name = null; 

System.gc(); // Nothing is eligible !!! Still referenced by the Map.

Object test = entry.get("test");    // Returns the object.

このシナリオでは、最初に HashMap から参照されないようにエントリを削除する必要があります。

于 2013-01-03T08:30:41.200 に答える