在达到范围后,您是否始终将null
分配给对象?
或者你依靠JVM进行垃圾收集?
您是否为所有类型的应用程序执行此操作,无论其长度如何?
如果是这样,它总是一个好习惯吗?
答案 0 :(得分:11)
除非您有非常具体的原因,否则没有必要将对象显式标记为null。此外,我从未见过在不再需要时将所有对象标记为null的应用程序。垃圾收集的主要好处是内在的内存管理。
答案 1 :(得分:8)
答案 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
的引用:
这意味着我只在迭代过程中使用这种技术,其中我使用引用来存储传入的大量对象。处理完毕后,我不再需要该集合了,但我想重用下一个集合的引用。
在这种情况下(仅在那种情况下),然后我调用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()方法(或类似的东西)。