我们是否应该在 finally 块中将本地对象引用分配给 null



当对象在方法的本地范围内时,我们是否应该在最终块中引用 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;
    }
}

在这里,释放rsquery似乎没有任何目的,因为它们在方法执行后自动对垃圾回收有效。任何帮助都会做得很好。

在某些边缘情况下,这可能非常重要:它可以在正在运行的程序和 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 将在所有无法访问的对象上完成。这与性能问题无关。

最新更新