バッチ処理を数週間動かすとJavaのメモリ使用量が爆発的に増える現象が発生しました。
ヒープダンプを解析した結果、Hibernateのsessionが無駄に溜まっている様子。
調べてみたら、session.createSQLQueryを使うとメモリリークします。とのこと。
この問題はHibernate3.1.3で認知され、Hibernate3.5.1で解決しています。
原因は、equalsメソッドとhashCodeの実装ミス。
effective javaでも問題にあがってましたが、equalsメソッドのオーバーライドは難しい。
■参考:http://opensource.atlassian.com/projects/hibernate/browse/HHH-2470