我正在使用包含Hibernate数据存储的Java程序进行一些实验。实验可以包含许多试验,每个试验可以有许多试验。每个实验都在一次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
有人能想出解决我问题的方法吗?
答案 0 :(得分:2)
为了防止你的对象进入Hibernate会话(并且能够被垃圾收集),你应该简单地从Hibernates会话中分离你的对象(使用session.evict()
)。在您的情况下,您应该在每次保存Test
后迭代所有Trial
个实例,逐出它们,然后逐出Trial
。
当您再次需要对象时,可以使用常规Hibernate方法(加载或查询)再次加载对象。如果不需要,你应该考虑Trial.test
上的延迟加载。