Discutiremos sobre el concepto de pérdida de memoria en Java en este capítulo.
El siguiente código crea una pérdida de memoria en 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
}
}
En el código anterior, cuando el método sale, no hemos cerrado el objeto de conexión. Por lo tanto, la conexión física permanece abierta antes de que se active el GC y vea el objeto de conexión como inalcanzable. Ahora, llamará al método final en el objeto de conexión, sin embargo, es posible que no se implemente. Por tanto, el objeto no se recogerá como basura en este ciclo.
Lo mismo ocurrirá en el siguiente hasta que el servidor remoto vea que la conexión ha estado abierta durante mucho tiempo y la finalice a la fuerza. Por lo tanto, un objeto sin referencia permanece en la memoria durante mucho tiempo, lo que crea una fuga.