我试图通过关闭它并在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
答案 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();
}
}