在使用后为每个应用程序中的对象分配“null”

时间:2009-12-04 16:57:05

标签: java garbage-collection coding-style

  • 在达到范围后,您是否始终将null分配给对象?

  • 或者你依靠JVM进行垃圾收集?

  • 您是否为所有类型的应用程序执行此操作,无论其长度如何?

  • 如果是这样,它总是一个好习惯吗?

14 个答案:

答案 0 :(得分:11)

除非您有非常具体的原因,否则没有必要将对象显式标记为null。此外,我从未见过在不再需要时将所有对象标记为null的应用程序。垃圾收集的主要好处是内在的内存管理。

答案 1 :(得分:8)

  • 不,不要这样做,除了静态字段等特定情况或知道变量/字段比引用它的代码长批次
  • 是的,但是对VM的限制有了解(以及如何不小心导致内存块)
  • N / A

答案 2 :(得分:6)

我将几乎所有变量都声明为“final”。我也使我的方法变小,并将大多数变量声明为方法本地。

因为它们是最终的,所以我不能在使用后将它们分配为空...但这很好,因为方法很小,一旦它们返回,对象就有资格进行垃圾收集。由于大多数变量都是局部变量,因此意外保持参考的可能性比所需时间长(内存泄漏)的可能性更小。

答案 3 :(得分:2)

将null赋值给变量并不意味着它会立即被垃圾收集。事实上,它很可能不会。是否将变量设置为null通常只是装饰性的(静态变量除外)

答案 4 :(得分:2)

垃圾收集并不像您预期​​的那样神奇。只要从任何可到达对象引用对象,就无法收集它。因此,为了避免内存泄漏,可能绝对需要使引用为空。我不是说你应该这样做,但总是在必要的时候。

答案 5 :(得分:2)

我们不会练习这个赋值“null”。如果变量的范围已达到它的结束,它应该已经为GC准备好了。由于长时间运行操作,可能存在一些边缘情况,其中范围持续一段时间,在这种情况下将其设置为null可能是有意义的,但我认为它们很少见。

不言而喻,如果变量是对象的成员变量或静态变量,因此永远不会超出范围,那么将其设置为null是必需的。

答案 6 :(得分:1)

正如其他人所说,通常不需要。

不仅如此,它还会使您的代码变得混乱,并在重新访问代码时增加了人们需要阅读和理解的数据。

答案 7 :(得分:1)

不对对象进行分配,而是对变量进行分配,这意味着该变量随后保存对某个对象的引用。为变量赋值NULL不是销毁对象的方法,它只是清除一个引用。如果您要清除的变量无论如何都会在之后离开其范围,则分配NULL只是无用的噪声,因为在任何情况下都会在离开范围时发生。

答案 8 :(得分:1)

我倾向于使用这种做法的一次是,如果我需要在方法的某些早期部分转换大Collection

例如:

public void foo() {
  List<? extends Trade> trades = loadTrades();
  Map<Date, List<? extends Trade>> tradesByDate = groupTradesByDate(trades);
  trades = null; // trades no longer required.

  // Apply business logic to tradesByDate map.
}

显然,我可以通过将其重构为另一种方法来减少对此的需求:Map<Date, List<? extends Trade>>> loadTradesAndGroupByDate()所以它实际上取决于代码的环境/清晰度。

答案 9 :(得分:1)

我只在以下情况下指定对null的引用:

  1. 代码真的位于关键内存部分。
  2. 引用的范围很广(以后必须重用)。如果不是这种情况,我只是在尽可能小的代码块中声明它。它将自动收集。
  3. 这意味着我只在迭代过程中使用这种技术,其中我使用引用来存储传入的大量对象。处理完毕后,我不再需要该集合了,但我想重用下一个集合的引用。

    在这种情况下(仅在那种情况下),然后我调用System.gc()给垃圾收集器提示。我通过堆可视化工具监控这种技术,它适用于大型集合(超过500Mb的数据)。

答案 10 :(得分:0)

使用.Net时,我认为不需要将对象设置为null。只是让垃圾收集发生。

答案 11 :(得分:0)

  

- 在到达范围后,您是否始终将null分配给对象?

没有

  

- 或者你依靠JVM进行垃圾收集?

  

- 您是否为所有类型的应用程序执行此操作,无论其长度如何?

  

- 如果是这样,它总是一个好习惯吗?

N / A

答案 12 :(得分:0)

我假设你问的是这个问题,因为你已经看到过将变量分配给null的代码,它们永远不会被再次访问。

我不喜欢这种风格,但另一位程序员广泛使用它,并说他被教导在他的大学的编程课程中这样做。他给出的推理是,如果以后尝试重用变量,它会阻止无法检测到的错误,而不是不确定的行为,他会得到一个空指针异常。

因此,如果您倾向于使用不应该使用变量的变量,那么它可能会使您的代码更容易调试。

答案 13 :(得分:0)

无论我是否将引用设置为null,都会发生一类内存泄漏错误 - 如果我使用的库是用C语言编写而没有内存管理,那么简单地将对象设置为null就不一定释放记忆。我们不得不调用对象的close()方法来释放内存(当然,在将它设置为null后我们无法做到。)

因此在我看来,java中事实上的内存管理方法是依赖垃圾收集器,除非你使用的对象/库有一个close()方法(或类似的东西)。