memory-management - Neo4j 什么时候释放内存?

标签 memory-management neo4j

我对内存管理有点困惑。

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

我有一个带有 for 循环的单线程加载程序,其中包含一个嵌套的 for 循环。在外部 for 循环中,我执行 graphDb.beginTx();,从 mysql 获取测试对象的 ID 并为此创建一个节点。在内部 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 以更好的方式获得它。

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

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

非常感谢!

问候,

萨钦

最佳答案

对于这种不需要事务的大量插入,我建议使用批量插入。

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


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

关于memory-management - Neo4j 什么时候释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15349112/

相关文章:

ios - ARC 及其工作原理。

Java内存清理

c - 解决 C 中链表计数函数的边界错误

C++ 结构 - 定义最小大小

c++ - 为什么我们使用内存管理器?

go - 如果关系不存在,则新主义相关

neo4j - Neo4j/Spring-Data 中的懒惰/急切加载/获取

Spring 数据 Neo4j : persist() method undefined

neo4j - 如何使用密码查询在neo4j中找到特定关系类型的最连接节点?

neo4j - 将 Neo4j 数据导入 Gephi 0.9.1