プログラムでヒープダンプを実行しました。メモリアナライザツールで開いたとき、Java.lang.ref.Finalizer
ために org.logicalcobwebs.proxool.ProxyStatement
は多くのメモリを消費していました。これはなぜですか?
一部のクラスはObject.finalize()
メソッドを実装します。このメソッドをオーバーライドするオブジェクトは、バックグラウンドスレッドコールファイナライザによって呼び出される必要があり、これが発生するまでオブジェクトをクリーンアップすることはできません。これらのタスクが短く、これらの多くを破棄しない場合、すべて正常に機能します。ただし、これらのオブジェクトを多数作成している場合や、ファイナライザに長時間かかる場合は、ファイナライズするオブジェクトのキューが蓄積されます。このキューがすべてのメモリを使い果たす可能性があります。
解決策は
既存のライブラリを使用しているため、最後のオプションが最適です。
私が理解できることから、ProxoolはJDBC接続の接続プールです。これは、問題はアプリケーションが接続プールを誤用していることであることを示唆しています。ステートメントオブジェクトでclose
を呼び出す代わりに、コードはおそらくそれらおよび/またはその親接続をドロップしています。 Proxoolは、基になるドライバー実装オブジェクトを閉じるためにファイナライザーに依存していますが、これにはそれらのファイナライザーインスタンスが必要です。また、接続が(実際の)データベース接続を必要以上に頻繁に開いたり閉じたりしていることを意味している可能性があり、これはパフォーマンスに悪影響を及ぼします。
したがって、漏れたResultSet、Statement、Connectionオブジェクトのコードをチェックし、finally
ブロックでそれらを閉じることを確認することをお勧めします。
メモリダンプを見ると、898,527,228バイトがどこに向かっているのか気になると思います。大部分は、IDが2aab07855e38
であるFinalizerオブジェクトによって保持されます。ダンプファイルがまだある場合は、thatFinalizer
が参照しているものを見てください。 Proxoolオブジェクトよりも問題が多いようです。