当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;
}
}
在这里,释放rs
和query
似乎没有任何意义,因为它们在方法执行后自动对垃圾收集有效。任何帮助都会很棒。
答案 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
或其他方面)并不重要。