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メソッドが呼び出されますが、実装されていない可能性があります。したがって、このサイクルでオブジェクトがガベージコレクションされることはありません。

リモートサーバーが接続が長時間開いていることを確認し、強制的に終了するまで、同じことが次に起こります。したがって、参照のないオブジェクトがメモリに長時間残り、リークが発生します。