2011-07-13 30 views
0

私はWebcrawlerを持っています。tharは接続プールを使ってデータベースに接続し、ページを挿入します。PostgreSQL接続のメモリ使用量が増えています

プログラムの実行中にメモリ使用量が増加していることがわかりました。私はいくつかのPreparedStatementや他の接続オブジェクトを閉じるのを忘れていたと思います。

私はconnection.closeメソッドを呼び出しますが、connectinをデータベースに返します。

接続に開いているオブジェクトがあるかどうかを確認する方法はありますか?

+0

メモリを大量に使用していることをどのように知っていますか?これは上からのものですか?それはSHRですか? SHRが時間の経過とともにshared_buffersのサイズに等しくなるように成長するのは正常ですが、問題はありません。メモリ使用の証拠を表示してください –

答えて

1

あなたのアプリケーションにメモリリークがあると思われるようです。デバッグを開始するには、jmap、JDKに付属のユーティリティ(通常はjava、javac、javadocなどのbinディレクトリにあります)を使用します。このコマンドは、JVMにあるすべてのオブジェクトのメモリマップを生成します。アプリケーションの実行中に時間をかけて実行し、オブジェクト数を比較して、合計カウントが連続的に増加するように見えるが、ガベージコレクションの結果として減少しないようなオブジェクトの種類があるかどうかを確認できます。

jmap -heap -histo <PROCESS_ID_OF_YOUR JVM> 

あなたが本当にあなたの文は正しくオブジェクトを閉じていない場合、あなたはすぐにあなたのスタックの最上部までのバブルにそれらが表示されます。

クローズ可能なオブジェクトは、開いている接続、文などを残さないように、最終ブロックで閉じる必要があります。クローズする前に例外がスローされた場合、JVMに滞っています。

注:Windowsでは、これらの実行可能ファイルの拡張子は.exeです。

+0

jmapの代わりに、visualvm http://visualvm.java.net/ – sbridges

関連する問題