Java Virtual Machine - wyciek pamięci w Javie
W tym rozdziale omówimy koncepcję wycieku pamięci w Javie.
Poniższy kod tworzy wyciek pamięci w Javie -
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
}
}
W powyższym kodzie, gdy metoda kończy działanie, nie zamknęliśmy obiektu połączenia. Zatem połączenie fizyczne pozostaje otwarte przed wyzwoleniem GC i postrzega obiekt połączenia jako nieosiągalny. Teraz wywoła ostatnią metodę na obiekcie połączenia, jednak może nie zostać zaimplementowana. W związku z tym obiekt nie zostanie usunięty jako śmieci w tym cyklu.
To samo stanie się w następnym, dopóki serwer zdalny nie zobaczy, że połączenie było otwarte przez długi czas i siłą je zakończy. W ten sposób obiekt bez odniesienia pozostaje w pamięci przez długi czas, co powoduje wyciek.