Neo4j何时释放内存?

时间:2013-03-11 21:35:15

标签: memory-management neo4j

我对内存管理有点困惑。

我在java应用程序中以嵌入模式使用neo4j。版本 - 1.8.1。 JVM版本 - 1.6

我有一个带有for循环的单线程加载器,它包含一个嵌套的for循环。在外部for循环中,我做graphDb.beginTx();,从mysql获取测试对象的id并为其创建一个Node。在内部for循环中,我正在查询mysql以获取一堆相关对象。我为它们创建节点以及与我在外部循环中创建的节点的对应关系。

在外部for循环结束时,我会tx.success()tx.finish()

for (int x = 0; x < 10000000; x++) {
    Transaction tx = graphDb.beginTx();
    Node n = graphDb.createNode();
    Long id = n.getId();
    System.out.println("ID: " + id);
    n.setProperty("TestId", x); 
    * * * get the mysql ids * * * *
    for (int y = 0; y < mysqlidlist; y++) {
        Node n1 = graphDb.createNode();
        Long id2 = n1.getId();
        n1.setProperty("InnerTestId", y);
        Relationship rel = n.createRelationshipTo(n1, NodeRelation.ATTRIBUTE);
        rel.setProperty("Weight", 0.3);
    }
    tx.success();
    tx.finish();
    tx = null;
}

根据我的读数,我认为Neo4j会释放交易抓取的内存。但是,我看到内存使用量总是在增加,并且在一段时间后它会达到Xmx设置。我将对其进行分析以确保没有其他泄漏。我在结尾处将所有其他变量设置为null,这应该有助于GC以更好的方式获得它。

我理解错了吗?如果是这样,建议的内存管理最佳实践是什么?

下一步 - Single Threaded loader将扩展为多线程加载器,因此,要确保内存管理和事务管理是健壮的。

非常感谢!

此致

萨钦

2 个答案:

答案 0 :(得分:1)

对于这种大规模插入,如果您不需要交易,我建议使用批量插入。

http://docs.neo4j.org/chunked/milestone/batchinsert.html


或者,不推荐:如果你想使用你的代码片段,请添加如下内容: if(y%1000 == 0){tx.success(); tx.finish()} 在for循环中提交并释放每个 n 插入使用的内存,但它会慢一些

答案 1 :(得分:0)

您可以尝试关闭缓存(使用cache_type = none)。 docs.neo4j.org/chunked/milestone/configuration-caches.html