Виртуальная машина Java - утечка памяти в Java

В этой главе мы обсудим концепцию утечки памяти в Java.

Следующий код создает утечку памяти в 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
   }
}

В приведенном выше коде при выходе из метода мы не закрыли объект подключения. Таким образом, физическое соединение остается открытым до того, как GC будет запущен и увидит объект соединения как недоступный. Теперь он вызовет последний метод объекта подключения, однако он может не быть реализован. Следовательно, в этом цикле объект не будет собираться сборщиком мусора.

То же самое произойдет и дальше, пока удаленный сервер не увидит, что соединение было открыто в течение длительного времени, и принудительно завершит его. Таким образом, объект без ссылки остается в памяти в течение длительного времени, что создает утечку.