そこで、ドキュメントと画像をアップロードして、データベースに byte[] として保存できるアプリケーションを用意しました。
(ここで zip としてダウンロードし、STS http://dl.dropbox.com/u/2342474/byteMemoryLeak.zipにインポートできる最小限のサンプル プロジェクトを作成しました。必要なのは、datasource.groovy に移動して、データベース設定を変更してください)
したがって、ドメイン オブジェクトは次のようになります。
class Test {
byte[] data
static constraints = {
data nullable: false, maxSize: 1024*1024*40
}
}
コントローラーとビューはすべて、generate-all コマンドで直接生成されます...ここでは何も変更されていません...
プロジェクトを開始すると、テスト コントローラーに移動します... 新規作成を押します... ドキュメントをアップロードします... 5 ~ 10 MB のようなものを使用します...そして作成を押します...
save() メソッドが実行されている間、そして show メソッドが呼び出されたときにもメモリ使用量が増えると予想しています...しかし、GC のロードが終了したら、GC はそれらのオブジェクトを取得して破棄する必要があります。 ...今、Your Kit Java Profilerを使用してメモリ使用量を確認しましたが、参照が弱いか到達できないbyte []の参照が3つあることがわかります...なぜですか? show() メソッドまたは save() メソッドが完了したときに削除されるべきではありませんか?
ここにスクリーンショットがあります: [メモリリーク]: http://i.imgur.com/XGj6A.png
gc をより頻繁に実行するには、Tomcat に特別な設定を行う必要がありますか?
私はこれについて非常に混乱しており、現在テスト中のアプリケーションで実際に問題が発生します。これは、人々が多くのドキュメントをアップロードしているため、ヒープメモリがどんどんいっぱいになり、ほとんどクリーンアップされないためです。ある時点でメモリ不足の例外が発生します... list() メソッドでも同じことが実際に発生し、すべてのオブジェクトがロードされ、実際にはオブジェクトごとに byte[] がロードされ、メモリ内に読み込まれ、クリーンアップされません。 ..
たぶん、私は何かを見逃しているか、何か間違っているだけです...どんな助けも大歓迎です...
ありがとうクリス