处理后将对象设置为null是一个好习惯吗?

时间:2012-12-27 17:42:12

标签: java garbage-collection

我有这样的场景:

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进行进一步处理。作为最佳做法,我应该将dto设置为<{>第5行中的null还是忽略它?

通过将其设置为null,我期待快速垃圾收集。这是对的吗?

4 个答案:

答案 0 :(得分:26)

不,不要将局部变量设置为null以加速GC的收集:编译器足够聪明,可以在没有您帮助的情况下解决问题; null分配只会使您的代码看起来很脏。

非本地人是一个不同的故事:如果你有一个成员变量可能会保持超过必要的时间,最好将其设置为null并防止 lingerer内存泄漏

答案 1 :(得分:13)

第4行(一旦方法调用结束)将超出范围,因此在这种情况下不需要

答案 2 :(得分: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中删除该条目。

答案 3 :(得分:-8)

如果您计划将来使用C或C ++进行编码,那么这是一种很好的做法。