Java JDBM3出现意外内存负载

Java JDBM3出现意外内存负载,java,memory,memory-leaks,Java,Memory,Memory Leaks,虽然JDBM3数据库承诺(据我所知)在访问和写入数据时使用很少的内存,但我有以下问题: 即使在树映射的键集中进行迭代,似乎所有数据都加载到内存中。因此,以下代码: db=DBMaker.openFile("Myfile") .make(); SortedMap<Integer, double[]> MyMap=db.getTreeMap("MyMap"); int i=0; final Set<Integer> key

虽然JDBM3数据库承诺(据我所知)在访问和写入数据时使用很少的内存,但我有以下问题: 即使在树映射的键集中进行迭代,似乎所有数据都加载到内存中。因此,以下代码:

    db=DBMaker.openFile("Myfile")
        .make();   
    SortedMap<Integer, double[]> MyMap=db.getTreeMap("MyMap");
    int i=0;
    final Set<Integer> keySet = MyMap.keySet();
    for (Object key : keySet) {
        System.out.println(i++);
     }
db=DBMaker.openFile(“Myfile”)
.make();
SortedMap MyMap=db.getTreeMap(“MyMap”);
int i=0;
最终设置keySet=MyMap.keySet();
用于(对象键:键集){
System.out.println(i++);
}
导致在内存中加载所有双矩阵,最终导致OutOfMemory错误。在我看来,加载的数据量也比数据本身多得多。 到目前为止,我考虑的是:

  • 这是虫子吗?或者在创建/打开数据库(缓存、事务?)时有一些参数禁用此“功能”

  • 这是我使用的JDBM3 alpha 3中的一个bug吗(当有alpha 4时)?我只需要在切换之前验证这一点,因为没有兼容性,我将不得不从头开始做所有事情

  • 这种情况会发生在较新的MapDB(以前的JDBM4)上吗?我还需要在切换之前验证这一点

  • 或者这是图书馆出于某种原因的正常行为


    • 首先:OOEM的常见原因是写入。 JDMB3将未限制的数据保存在内存中。因此,对于大型事务,您将耗尽内存。 解决方案是每N个项目提交一次。或者,您可以禁用事务(DBMaker选项),将更改直接写入文件


      第二:迭代键集不应将所有数据加载到内存中。如果有,那就是臭虫。但是JDBM3不受支持,所以我建议迁移到MapDB

      请注意,禁用缓存不起作用……是否使用堆分析器查看所有内存的位置?是的,Netbeans探查器显示每个向量都加载到内存中。我甚至没有使用.get()方法。。。只是在关键帧集中迭代!