在本章中將討論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
方法,但是,它可能無法實現。因此,在該迴圈中不會對對象進行垃圾收集。
同樣的事情將在下一次發生,直到遠程伺服器發現連接已經打開了很長時間並強制終止它。因此,沒有引用的對象長時間保留在記憶體中,這會產生洩漏。
上一篇:
Java虛擬機(JVM)調整GC
下一篇:無