【问题标题】:Should we assign local object references to null in a finally block?我们应该在 finally 块中将本地对象引用分配给 null 吗?
【发布时间】:2014-01-17 09:43:31
【问题描述】:

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

【问题讨论】:

  • 对象的范围是本地的...我认为这没有什么区别...一旦您退出块,它们就会为 GC 做好准备...
  • 这将使您的代码更难阅读,而不会对性能产生积极影响。所以...
  • 你是对的。在 finally 中将本地声明的引用变量设置为 null 不会增加任何性能或帮助垃圾收集 AFAIK
  • 不需要设置 null 但需要关闭您的资源,如关闭连接、语句、结果集
  • @DarshanPatel - 好点.. 但那是完全不同的上下文.. 这样的连接不会是本地对象.. 所以,它们必须被关闭.. 并且连接的关闭是异步发生的......

标签: java oop garbage-collection


【解决方案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 或其他地方)无效化并不重要。

【讨论】:

  • 感谢 Marko Topolnik!OOME 是日常行动中面临的最具破坏性的问题。
【解决方案2】:

不,不要这样做,因为当对象超出范围时它没有任何意义。当堆中没有该对象的所有者或 引用 时,垃圾收集器会自动处理所有 java 对象的释放。

Final 非常方便,因为无论您的代码中是否发生异常,它都会被执行。当你想要执行一些重要的资源管理工作时使用finally,比如关闭一个打开的数据库连接等等。HTH

【讨论】:

    【解决方案3】:

    不,我们不应该。它使代码更难阅读,并且在大多数情况下(例如您的示例)它绝对什么都不做,因为 GC 无论如何都会在范围之后开始。

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

    【讨论】:

      【解决方案4】:

      没有必要这样做。根本没有任何好处。一旦执行退出方法,局部变量就无法访问。 GC 将对所有无法访问的对象进行。这与性能问题无关。

      【讨论】:

        猜你喜欢
        • 2011-04-23
        • 2014-05-16
        • 1970-01-01
        • 2011-06-05
        • 2010-11-19
        • 2013-08-14
        • 1970-01-01
        • 1970-01-01
        • 2020-07-20
        相关资源
        最近更新 更多