1

Hibernateデータストレージを含むJavaプログラムを使用していくつかの実験を実行しています。実験には多くの試行を含めることができ、各試行には多くのテストを含めることができます。各実験は、単一のSpringトランザクションで実行されます。

テストの量が少ない場合はすべて問題ありませんが、データ量が増えると、Javaヒープスペースのメモリ不足の問題が発生し始めます。1回のトランザクションで処理しているデータの量を考えると、メモリの問題は妥当なようです。

これに対する私の現在の回避策は次のとおりです。

Set up and save the initial Experiment
Run a set of Tests.
Summarise the Test results and create a Trial record
Delete the Test records
Save the completed Trial
Prompt the Garbage Collector to run

これは機能し、フレームワークを使用して広範な実験を行うことができます。ただし、メモリの問題を防ぐために詳細なテストレコードを削除する必要があったため、詳細なテストレコードのデータ分析を実行するためのアクセス権がなくなりました。

私がやりたいのは、テストレコードをファイルに保存してから、ヒープから「アンロード」することです。トライアルには、保存されたテストレコードを含む1つがまだありますが、テストが完了したため、メモリ内の詳細は必要ありません。

Set up and save the initial Experiment
Run a set of Tests.
Summarise the Test results and create a Trial record
Save the Trial (with cascade saves for all Test records)
Unload the complete Test records 
Prompt the Garbage Collector to run

誰かが私の問題の解決策を考えることができますか?

4

1 に答える 1

2

オブジェクトがHibernateセッションに含まれないようにする(そしてガベージコレクションできるようにする)には、オブジェクトをHibernatesセッションからデタッチする必要があります(を使用してsession.evict())。あなたの場合、をTest保存するたびにすべてのインスタンスを繰り返し処理しTrial、それらを削除Trialしてから、同様に削除する必要があります。

オブジェクトが再度必要になった場合は、通常のHibernateメソッド(ロードまたはクエリ)を使用してオブジェクトを再度ロードできます。Trial.test必要がない場合は、遅延読み込みを検討する必要があります。

于 2012-07-28T16:57:00.680 に答える