为什么JDBC ResultSet没有收集垃圾

时间:2013-11-22 06:54:08

标签: java mysql jdbc yourkit

我试图通过关闭它并在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结果集打开YourKit显示打开结果集的某些非零值。任何人都可以帮我在这里打开结果集0的数量。

提前致谢。 Tanmayee

4 个答案:

答案 0 :(得分:1)

java中的垃圾收集与C不同,在这里你释放内存并且它会立即释放内存,在Java中它到JVM时运行垃圾收集器,一些可能的条件可能是内存不足的情况当JVM调用垃圾收集器时,一个是我们调用System.gc()方法时,但是调用此方法不会导致调用垃圾收集器。 在上面的例子中,您正在使一个对象符合垃圾收集的条件,您不会从内存中释放任何内容。

答案 1 :(得分:1)

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

之后,您将能够找到从ResultSet到垃圾收集器根目录的路径。这将是一个共鸣,为什么ResultSets被泄露。以下链接可帮助您了解如何使用GC路径http://www.yourkit.com/docs/java/help/paths.jsp

答案 2 :(得分:0)

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

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

通过此至少,您可以浏览close失败的日志并与YourKit同步!

答案 3 :(得分:0)

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

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

   }}catch(Exception e){
e.printStackTrace();
}
 }