1

我正在使用包括 Hibernate 数据存储的 Java 程序运行一些实验。一个 Experiment 可以包含多个 Trial,每个 Trial 可以有多个 Test。每个实验都在单个 Spring 事务中进行。

当有少量测试时,一切都很好,但随着数据量的增加,我开始遇到 Java 堆空间内存不足的问题。考虑到我在单个事务中处理的数据量,内存问题似乎是合理的。

我目前的解决方法是:

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

这很有效,我可以使用该框架进行广泛的实验。但是,我不再有权对详细的测试记录进行数据分析,因为我不得不删除它们以防止出现内存问题。

我想做的是将测试记录保存到文件中,然后从堆中“卸载”它们。试用版仍然会有一对多保存的测试记录,但由于测试已完成,我不再需要内存中的详细信息。

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 Session 中(并且能够被垃圾收集),你应该简单地将你的对象从 Hibernates 会话中分离出来(使用session.evict())。Test在您的情况下,您应该在每次保存 a 后遍历所有实例Trial,逐出它们,然后也逐出您的实例Trial

当您再次需要您的对象时,您可以使用普通的 Hibernate 方法(加载或查询)再次加载您的对象。Trial.test如果不需要它们,您可能应该考虑延迟加载。

于 2012-07-28T16:57:00.680 回答