在本章中將討論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
方法,但是,它可能無法實現。因此,在該迴圈中不會對物件進行垃圾收集。
同樣的事情將在下一次發生,直到遠端伺服器發現連線已經開啟了很長時間並強制終止它。因此,沒有參照的物件長時間保留在儲存器中,這會產生洩漏。