0

我试图通过关闭它并在 finally 块中将值设置为 null来释放JDBC ResultSet使用的空间。前任:

try{
  //some query executed here and resultset used to get the values from the db
}catch(Exception exp){
 //log exception here
}finally{
 //close resultset
  if(rs != null){
  rs.close();
  rs = null;
 }
}

当我检查YourKit中打开的 ResultSet 的数量时,即使所有结果集都已关闭并设置为 null,而不是显示 0 结果集 open YourKit 显示打开结果集的一些非零值。任何人都可以在这里帮助我使打开结果集的数量为 0。

提前致谢。坦马伊

4

4 回答 4

2

作为 YourKit 开发人员,我建议重现 ResultSets 在内存中的情况(当它们不应该在内存中时)并捕获内存快照。

之后,您将能够找到从 ResultSet 到垃圾收集器根的路径。这将是 ResultSet 被泄露的原因。这是帮助如何使用 GC 路径的链接http://www.yourkit.com/docs/java/help/paths.jsp

于 2013-11-28T12:21:04.920 回答
1

Java中的垃圾收集与C中的不同,在C中你释放内存,它会立即释放内存,在Java中它取决于JVM何时运行垃圾收集器,一些可能的情况可能是当JVM运行时内存不足的情况调用垃圾收集器,一种是当我们调用 System.gc() 方法时,但是调用此方法不会导致调用垃圾收集器。在上述情况下,您正在使对象符合垃圾收集的条件,您不会从内存中释放任何东西。

于 2013-11-22T07:00:53.200 回答
0

close可能会抛出可能导致打开的错误ResultSet(罕见但可能的情况),理想情况下,数据库资源清理应该发生在try-catch

finally {
if(rs != null) {
try{
 rs.close();
}catch(Exception e) {
 //handle, log ..
}
}

有了这个,您至少可以浏览日志以查找close故障并与 YourKit 同步!

于 2013-11-22T06:59:19.970 回答
0

在 finally 块中你可以这样写然后它会起作用,因为,这里为什么我们使用 try-catch 块意味着有时 ResultSet 对象可能可用或不可用。

finally{
try{
 if(rs!=null){
 rs.close();

   }}catch(Exception e){
e.printStackTrace();
}
 }
于 2013-11-22T07:19:00.700 回答