Виртуальная машина 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 будет запущен и увидит объект соединения как недоступный. Теперь он вызовет последний метод объекта подключения, однако он может не быть реализован. Следовательно, в этом цикле объект не будет собираться сборщиком мусора.
То же самое произойдет и дальше, пока удаленный сервер не увидит, что соединение было открыто в течение длительного времени, и принудительно завершит его. Таким образом, объект без ссылки остается в памяти в течение длительного времени, что создает утечку.