Máy ảo Java - Rò rỉ bộ nhớ trong Java

Chúng ta sẽ thảo luận về khái niệm rò rỉ bộ nhớ trong Java trong chương này.

Đoạn mã sau tạo ra một rò rỉ bộ nhớ trong 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
   }
}

Trong đoạn mã trên, khi phương thức thoát, chúng ta chưa đóng đối tượng kết nối. Do đó, kết nối vật lý vẫn mở trước khi GC được kích hoạt và coi đối tượng kết nối là không thể truy cập. Bây giờ, nó sẽ gọi phương thức cuối cùng trên đối tượng kết nối, tuy nhiên, nó có thể không được thực hiện. Do đó, đối tượng sẽ không được thu gom rác trong chu kỳ này.

Điều tương tự sẽ xảy ra tiếp theo cho đến khi máy chủ từ xa thấy rằng kết nối đã được mở trong một thời gian dài và buộc phải chấm dứt nó. Do đó, một đối tượng không có tham chiếu sẽ lưu lại trong bộ nhớ trong một thời gian dài, điều này tạo ra một rò rỉ.