【问题标题】: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 中删除条目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-01
        • 2011-03-06
        • 2012-11-30
        • 2011-11-03
        • 2011-03-22
        • 2019-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多