Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 减少批处理JDO插入的内存使用_Java_Jdo_Datanucleus - Fatal编程技术网

Java 减少批处理JDO插入的内存使用

Java 减少批处理JDO插入的内存使用,java,jdo,datanucleus,Java,Jdo,Datanucleus,我们有一个Java web应用程序,使用Data Nucleus 1.1.4/JDO 2.3实现持久性 有一个批量导入操作,可以一次性保存大量JDO对象。我们遇到过一些情况,因为要导入的数据太大而抛出OutOfMemoryError 预期的模式是在输入流中循环,解析一行,实例化一个JDO对象,调用makePersistent,然后释放对JDO对象的对象引用,以便无论输入数据大小如何都保持内存占用平坦 在此操作期间对堆进行一些分析时,JDO对象实例似乎会堆积起来并占用大量内存,直到commit发生

我们有一个Java web应用程序,使用Data Nucleus 1.1.4/JDO 2.3实现持久性

有一个批量导入操作,可以一次性保存大量JDO对象。我们遇到过一些情况,因为要导入的数据太大而抛出OutOfMemoryError

预期的模式是在输入流中循环,解析一行,实例化一个JDO对象,调用makePersistent,然后释放对JDO对象的对象引用,以便无论输入数据大小如何都保持内存占用平坦

在此操作期间对堆进行一些分析时,JDO对象实例似乎会堆积起来并占用大量内存,直到
commit
发生。尽管我们没有对它们进行引用,但看起来Data Nucleus的
PersistenceManager
Transaction
实现引用了一个
org.datanucleus.ObjectManagerImpl
对象,该对象包含一个“脏”JDO对象实例列表(实际上是原始实例的副本)。这可能有一个很好的理由,但我有点惊讶框架需要保留每个JDO对象的副本。它们在提交后被释放,但考虑到我们希望确保所有插入都以原子方式进行,我们需要在事务内部运行此操作。在它的当前状态下,内存使用量与数据输入大小成线性相关,这为我们提供了这些OutOfMemoryErrors——如果不是单个操作,那么是并发操作


对于这样的批处理JDO插入操作,是否有一些技巧或最佳做法可以让内存占用尽可能接近平坦?

我发现,最佳做法是在循环中定期调用PersistenceManager的flush方法。这会导致JDO框架(ObjectManagerImpl)放弃对象。

我不确定如何解决这个问题,但我相信说明持久性配置属性文件内容会非常有帮助。