ResultSet从数据库中获取记录。
使用结果集对象后,我们最终关闭结果集。
问题是,一旦调用rs.close(),它将释放从内存中删除获取的记录的权限吗?
要么
当JVM面临空间不足时,将调用垃圾回收器来删除resultSet吗?
如果JVM在内存不足时正在调用GC,那么在Java程序中手动调用Garbage收集器以释放空间是一种好习惯吗?
最佳答案
通常使用数据库游标来实现结果集。调用resultSet.close()
将释放该光标,因此它将立即释放数据库中的资源。
结果集读取的数据通常以记录块的形式接收。调用resultSet.close()
可能会“释放”最后一个块,使其符合GC的条件,但是一旦resultSet
本身超出范围并符合GC的条件,无论如何都会发生这种情况,并且很可能在调用close()
之后立即发生,因此,调用close()
是否提前释放Java内存确实无关紧要。
Java内存只能通过GC运行来释放。您无法控制何时发生(调用System.gc()
只是一个提示,您没有控制权)。
您正在考虑错误的事情。您应该关注的是:
确保总是关闭资源1,以释放数据库和系统资源。
最好使用try-with-resources完成。
确保您没有保留太多数据,例如如果可以在获取数据时对其进行处理,则不要为检索到的每一行创建对象。
通常是内存泄漏发生,而不是JDBC驱动程序内部。
1)例如ResultSet
,Statement
,Connection
,InputStream
,OutputStream
,Reader
,Writer
等