【问题标题】:Is it a good practice to set an object to null after processing?处理后将对象设置为 null 是一种好习惯吗?
【发布时间】:2012-12-27 17:42:11
【问题描述】:
我有这样的场景:
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,我期待快速垃圾收集。对吗?
【问题讨论】:
标签:
java
garbage-collection
【解决方案1】:
不,不要将局部变量设置为 null 以加快 GC 收集它们的速度:编译器足够聪明,无需您的帮助就可以解决; null 分配只会让你的代码看起来很脏。
非本地变量是另一回事:如果您有一个成员变量可能存在的时间超过必要的时间,最好将其设置为 null 并防止 lingerer 内存泄漏 .
【解决方案2】:
在第 4 行之后(一旦方法调用结束),它将超出其自身范围,因此在这种情况下不需要
【解决方案3】:
正如已经说过的,编译器在本地范围内足够聪明,但在非本地范围内,它又是更加特定于上下文的。人们需要了解在特定点取消引用是多么合法。在使用 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 中删除条目。