当对象在方法的本地范围内时,我们是否应该在最终块中引用 Objects 以 null?这样做可以解决哪些性能问题?
代码:
Map<String, Map<String, String>> getData(Map<String, String> params) {
StringBuilder query = new StringBuilder(); // Construct query using it
ResultSet rs = null;
try {
rs = DataUtil.getData(query);
while(rs.next) {
// store data in return Map
}
} catch(ConnectionException ce){
ce.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
} finally {
rs = null;
query = null;
}
}
在这里,释放rs
和query
似乎没有任何目的,因为它们在方法执行后自动对垃圾回收有效。任何帮助都会做得很好。
在某些边缘情况下,这可能非常重要:它可以在正在运行的程序和 OutOfMemoryException 之间产生差异。请考虑以下代码:
long[] hugeAry = new long[Integer.MAX_VALUE]; // barely fits on the heap
... work on hugeAry;
hugeAry = null;
int[] intHugeAry = new int[Integer.MAX_VALUE];
... work on this one
注释掉hugeAry = null
很容易导致 OOME。这些案例可能比这更离奇——在 SO 上查看这个相关主题。
但是,不要误会我的意思:在 99.9% 的情况下,取消当地人(finally
或其他方式)并不重要。
不,不要这样做,因为当对象超出范围时,它没有任何意义。当堆中没有所有者或对该对象的引用时,所有 Java 对象的释放将由垃圾回收器自动处理。
最后非常方便,因为无论您的代码中是否发生异常,它都会被执行。当您想要执行一些重要的资源管理工作(例如关闭打开的数据库连接等)时,最后使用。 HTH
不,我们不应该。它使代码更难阅读,并且在大多数情况下(例如您的示例)它绝对不执行任何操作,因为 GC 无论如何都会在范围之后启动。
一般来说,我们应该让Java处理它的垃圾收集,而不应该试图通过编写奇怪的代码来提高效率。
没有必要这样做。根本没有任何好处。一旦执行退出方法,就无法访问局部变量。GC 将在所有无法访问的对象上完成。这与性能问题无关。