在本章中将讨论Java中的内存泄漏概念。
以下代码在Java中创建内存泄漏 -
void queryDB() { try{ Connection conn = ConnectionFactory.getConnection(); PreparedStatement ps = conn.preparedStatement("query"); // executes a SQL ResultSet rs = ps.executeQuery(); while(rs.hasNext()) { //process the record } } catch(SQLException sqlEx) { //print stack trace } }
在上面的代码中,当方法退出时,没有关闭连接对象。因此,在GC被触发之前物理连接保持打开并且看到连接对象不可达。现在,它将在连接对象上调用final
方法,但是,它可能无法实现。因此,在该循环中不会对对象进行垃圾收集。
同样的事情将在下一次发生,直到远程服务器发现连接已经打开了很长时间并强制终止它。因此,没有引用的对象长时间保留在存储器中,这会产生泄漏。