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