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)例如ResultSetStatementConnectionInputStreamOutputStreamReaderWriter

10-07 19:40
查看更多