Java Virtual Machine - Speicherverlust in Java

In diesem Kapitel werden wir uns mit dem Speicherverlustkonzept in Java befassen.

Der folgende Code verursacht einen Speicherverlust in 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
   }
}

Im obigen Code haben wir beim Beenden der Methode das Verbindungsobjekt nicht geschlossen. Somit bleibt die physische Verbindung offen, bevor der GC ausgelöst wird, und sieht das Verbindungsobjekt als nicht erreichbar an. Jetzt wird die endgültige Methode für das Verbindungsobjekt aufgerufen, sie kann jedoch möglicherweise nicht implementiert werden. Daher wird das Objekt in diesem Zyklus nicht als Müll gesammelt.

Dasselbe passiert im nächsten Schritt, bis der Remote-Server feststellt, dass die Verbindung schon lange geöffnet ist, und sie gewaltsam beendet. Somit bleibt ein Objekt ohne Referenz für eine lange Zeit im Speicher, was ein Leck erzeugt.