Java Virtual Machine - หน่วยความจำรั่วใน Java

เราจะพูดคุยเกี่ยวกับแนวคิดการรั่วไหลของหน่วยความจำใน 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 จะถูกทริกเกอร์และมองว่าออบเจ็กต์การเชื่อมต่อไม่สามารถเข้าถึงได้ ตอนนี้มันจะเรียกวิธีสุดท้ายบนวัตถุการเชื่อมต่ออย่างไรก็ตามอาจไม่สามารถใช้งานได้ ดังนั้นวัตถุจะไม่ถูกเก็บรวบรวมในรอบนี้

สิ่งเดียวกันนี้จะเกิดขึ้นในครั้งต่อไปจนกว่าเซิร์ฟเวอร์ระยะไกลจะเห็นว่าการเชื่อมต่อเปิดอยู่เป็นเวลานานและมีผลบังคับให้ยุติการเชื่อมต่อ ดังนั้นวัตถุที่ไม่มีการอ้างอิงจึงยังคงอยู่ในหน่วยความจำเป็นเวลานานซึ่งทำให้เกิดการรั่วไหล