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进一步处理。作为最佳实践,我应该设置dtonull5 行还是忽略它?

通过将其设置为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 回答