将 Java 对象设置为 null 是否还执行任何操作?
2022-08-31 09:11:36
我正在浏览一些旧书,发现了Peter Hagger的“Practical Java”的副本。在性能部分中,建议在不再需要时设置对象引用。null
在 Java 中,设置对象引用是为了提高性能还是垃圾回收效率?如果是这样,在什么情况下这是一个问题?容器类?对象组合?匿名内部类?null
我经常在代码中看到这一点。这是现在已经过时的编程建议还是仍然有用?
我正在浏览一些旧书,发现了Peter Hagger的“Practical Java”的副本。在性能部分中,建议在不再需要时设置对象引用。null
在 Java 中,设置对象引用是为了提高性能还是垃圾回收效率?如果是这样,在什么情况下这是一个问题?容器类?对象组合?匿名内部类?null
我经常在代码中看到这一点。这是现在已经过时的编程建议还是仍然有用?
这有点取决于您何时考虑使引用为空。
如果你有一个对象链A->B->C,那么一旦A无法访问,A,B和C将都有资格进行垃圾回收(假设没有其他任何东西指的是B或C)。例如,没有必要,也从来没有任何需要将引用 A->B 或 B->C 显式设置为 null。
除此之外,大多数时候问题并没有真正出现,因为实际上你正在处理集合中的对象。您通常应该始终考虑通过调用适当的demovection()方法从列表,地图等中删除对象。
曾经有一些建议来设置对 null 的引用的情况,特别是在一个很长的范围内,其中内存密集型对象在作用域中途停止使用。例如:
{
BigObject obj = ...
doSomethingWith(obj);
obj = null; <-- explicitly set to null
doSomethingElse();
}
这里的基本原理是,因为 obj 仍在作用域内,因此在没有显式清空引用的情况下,在 doSomethingElse() 方法完成之前,它不会成为垃圾回收。这个建议可能不再适用于现代JVM:事实证明,JIT编译器可以确定在何时不再使用给定的本地对象引用。
不,这不是过时的建议。悬空引用仍然是一个问题,特别是如果你正在使用预分配的数组实现可扩展数组容器(或类似的东西)。超出列表“逻辑”大小的元素应为空,否则它们将不会被释放。ArrayList
请参阅有效的 Java 第 2 版,第 6 项:消除过时的对象引用。