Java Virtual Machine - Perdita di memoria in Java

In questo capitolo discuteremo del concetto di perdita di memoria in Java.

Il codice seguente crea una perdita di memoria 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
   }
}

Nel codice sopra, quando il metodo esce, non abbiamo chiuso l'oggetto connessione. Pertanto, la connessione fisica rimane aperta prima che il GC venga attivato e vede l'oggetto connessione come irraggiungibile. Ora chiamerà il metodo finale sull'oggetto connessione, tuttavia, potrebbe non essere implementato. Pertanto, l'oggetto non verrà raccolto in modo indesiderato in questo ciclo.

La stessa cosa accadrà nel prossimo fino a quando il server remoto non vedrà che la connessione è stata aperta da molto tempo e la terminerà forzatamente. Pertanto, un oggetto senza riferimento rimane a lungo nella memoria, il che crea una perdita.