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