Java虛擬機器(JVM)記憶體洩漏


在本章中將討論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方法,但是,它可能無法實現。因此,在該迴圈中不會對物件進行垃圾收集。

同樣的事情將在下一次發生,直到遠端伺服器發現連線已經開啟了很長時間並強制終止它。因此,沒有參照的物件長時間保留在儲存器中,這會產生洩漏。