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.