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がトリガーされる前に開いたままになり、接続オブジェクトが到達不能であると見なされます。これで、接続オブジェクトのfinalメソッドが呼び出されますが、実装されていない可能性があります。したがって、このサイクルでオブジェクトがガベージコレクションされることはありません。
リモートサーバーが接続が長時間開いていることを確認し、強制的に終了するまで、同じことが次に起こります。したがって、参照のないオブジェクトがメモリに長時間残り、リークが発生します。