在对象的作用域结束后,您是否总是将
null
分配给该对象?或者,您是否依赖JVM进行垃圾回收?
无论应用程序的长度如何,您是否都这样做?
如果是这样,这总是一个好的做法吗?
在对象的作用域结束后,您是否总是将null
分配给该对象?
或者,您是否依赖JVM进行垃圾回收?
无论应用程序的长度如何,您是否都这样做?
如果是这样,这总是一个好的做法吗?
除非您有特定的理由,否则不需要明确将对象标记为 null。此外,我从未见过一款应用程序在不再需要时将所有对象标记为 null。垃圾收集的主要好处是内在的内存管理。
我将几乎所有的变量声明为“final”。我还会让我的方法尽可能小,并将大多数变量声明为方法本地变量。
由于它们是final的,所以在使用后无法将它们赋值为空...但这没关系,因为方法很小,一旦返回对象就可以进行垃圾回收。由于大多数变量都是本地的,所以不太可能意外持有比需要更长时间的引用(内存泄漏)。
将 null 赋值给一个变量并不意味着它会立即被垃圾回收。实际上,它很可能不会被回收。通常而言,将变量设为 null 只是一种表面性的处理方式(静态变量除外)。
垃圾回收并不像你想象中的那样神奇。只要一个对象被任何可达对象引用,它就无法被回收。因此,为了避免内存泄漏,将一个引用设置为null可能是绝对必要的。我并不是说你总是应该这样做,但在必要时一定要这样做。
我倾向于使用这种方法的情况是,如果我需要在方法的早期部分转换一个大型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()
,所以这取决于情况/代码的清晰度。正如其他人所述,通常并不需要。
不仅如此,它还会使您的代码混乱,并增加了重新访问您的代码时某人需要阅读和理解的数据量。
赋值不是针对对象进行的,而是针对变量进行的,这意味着该变量随后将持有对某个对象的引用。将NULL赋给变量并不是销毁对象的方法,它只是清除一个引用。如果您要清除的变量在之后会离开其作用域,那么赋值NULL只是无用的噪音,因为这种情况在任何情况下都会在离开作用域时发生。
我只在以下情况下将引用分配给null
:
这意味着我仅在迭代过程中使用此技术,其中我使用引用来存储传入的大量对象集合。处理后,我不再需要该集合,但我想重用引用以获取下一个集合。
在这种情况下(仅在这种情况下),我会调用System.gc()
来提示垃圾回收器。我通过堆可视化器监视了这种技术,并且对于大型集合(超过500Mb的数据)非常有效。
java.lang.ref.WeakReference
(和java.lang.ref.SoftReference
)。使用 WeakReferences,您可以保留对对象的引用,而不会阻止GC。 (因此,引用的对象随时可能消失) - sfussenegger