我浏览了一些旧书,发现了一本彼得·哈格的《实用Java》。在性能部分,建议在不再需要时将对象引用设置为null
在Java中,将对象引用设置为null是否会提高性能或垃圾收集效率?如果是,在什么情况下这是一个问题?容器类?对象合成?匿名内部类
我经常在代码中看到这一点。这是过时的编程建议还是仍然有用
这在一定程度上取决于您何时考虑将引用置零
如果您有一个对象链A->B->C,那么一旦A不可访问,A、B和C都将有资格进行垃圾收集(假设没有其他任何东西指向B或C)。例如,没有必要,也从来没有需要显式地将引用A->B或B->C设置为null
除此之外,大多数情况下,这个问题并没有真正出现,因为实际上您正在处理集合中的对象。通常,您应该始终考虑通过调用appropiate remove()方法从列表、映射等中删除对象
过去有一些将引用设置为null的建议,特别是在长作用域中,内存密集型对象在作用域的一部分停止使用。例如:
{
BigObject obj=。。。
doSomethingWith(obj);
obj=null;<;--显式设置为null
doSomethingElse();
}
这里的基本原理是,由于obj仍在作用域中,因此在引用没有显式为空的情况下,直到doSomethingElse()方法完成之后,它才成为垃圾回收。这是在现代JVM上可能不再适用的建议:事实证明,JIT编译器可以计算出给定的本地对象引用在什么时候不再使用