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

时间:2014-01-17 09:43:32

标签: java oop garbage-collection

当Objects在本地方法范围内时,我们应该在finally块中将Object引用为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似乎没有任何意义,因为它们在方法执行后自动对垃圾收集有效。任何帮助都会很棒。

4 个答案:

答案 0 :(得分:1)

不,我们不应该。它使代码更难以阅读,并且在大多数情况下(例如您的示例)它绝对没有任何内容,因为GC将在范围之后开始。

一般来说,我们应该让Java处理它的垃圾收集,而不应该通过编写奇怪的代码来提高它的效率。

答案 1 :(得分:1)

没有必要这样做。没有任何好处。执行离开方法后,无法访问局部变量。 GC将在所有无法访问的对象上完成。这与性能问题无关。

答案 2 :(得分:1)

不要不这样做,因为当对象超出范围时,它并不意味着什么。当没有所有者或引用到堆中的该对象时,所有java对象释放将由垃圾收集器自动处理。

最后非常方便,因为无论代码中是否发生异常,它都会被执行。当您想要执行重要资源管理工作时,请使用最终,例如关闭已打开的数据库连接等.HTH

答案 3 :(得分:1)

有一些边缘情况,这可能非常重要:它可以区分正在运行的程序和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。案件可能比这更奇怪 - 查看this related topic on SO

但是,不要误会我的意思:在99.9%的情况下,归零当地人(finally或其他方面)并不重要。