Discutiremos sobre o conceito de vazamento de memória em Java neste capítulo.
O código a seguir cria um vazamento de memória em 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
}
}
No código acima, quando o método termina, não fechamos o objeto de conexão. Assim, a conexão física permanece aberta antes que o GC seja acionado e veja o objeto de conexão como inacessível. Agora, ele chamará o método final no objeto de conexão, no entanto, ele pode não ser implementado. Portanto, o objeto não será coletado como lixo neste ciclo.
O mesmo acontecerá no próximo até que o servidor remoto veja que a conexão está aberta há muito tempo e a encerre à força. Assim, um objeto sem referência permanece na memória por muito tempo, o que cria um vazamento.