java - Neo4j:死锁内存泄漏

标签 java neo4j deadlock out-of-memory

我要插入大量联系人和关系(数百万)。为了加快速度,我想我会对它们进行批处理,然后让多个线程同时插入它们。这会导致一些死锁,但由于我可以重试它们,所以我对此没有问题。

   public void doBatch(final Collection<Object> rows) throws Exception {
    int retryCount = 3;
    while(!(retryCount<3)) {
        Transaction tx = graphdb.beginTx();
        try {
            for (Object row : rows) {
                String[] fields = ((String) row).split(DELIMITER, -1);
                if (fields.length < 4) {
                    log.error("Not enough fields to process row:" + row);
                } else {
                    addLineToGraph(fields[0], fields[1], fields[2], fields[3]);
                }
            }
            tx.success();
            retryCount = 0;
        } catch (DeadlockDetectedException dead) {
            tx.failure();
            retryCount--;
            log.warn("Retry deadlock");
        } catch (Exception e) {
            tx.failure();
            throw e;
        } finally {
            tx.finish();
        }
    }
}

不幸的是,经过几个小时的运行并出现大量死锁后,即使尝试使用 10G 堆,我也会用完内存(超出 GC 开销限制)。分析堆栈转储后,我注意到有很多锁:

One instance of "org.neo4j.kernel.impl.transaction.RWLock" loaded by "sun.misc.Launcher$AppClassLoader @ 0xc0271350" occupies 672.139.928 (84,78%) bytes.
The memory is accumulated in one instance of "java.util.HashMap$Entry[]" loaded by "<system class loader>".

我的印象是,这是由失败的事务未释放锁引起的,因此我将我的代码限制为单个线程,以确保不会再发生死锁。执行此操作后,我可以看到由垃圾收集引起的正常锯齿图,并且不再出现内存不足错误。 据我了解 tx.finish();应该清理一切吗?或者我在这里遗漏了什么?

我在嵌入式模式下使用 neo4j 2.0.0-M03。

最佳答案

每当你更新关系节点的任何属性然后释放锁时使用锁怎么样

关于java - Neo4j:死锁内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17083971/

相关文章:

mongodb - 在单个应用程序中使用多种数据库类型对数据建模

java - 给定的 Java 程序中如何出现死锁?

java - 读取文件夹中的整个文件

java - 安装 ReporteRsjars 时无法加载 rJava.dll - 不是有效的 Win32 应用程序

java - 如何在wicket中进行weblogic表单认证

Neo4j 有序树

neo4j - 密码关系基数

go - 了解 golang channel : deadlock

c++ - 终止工作线程和主线程之间的竞争条件

java - 如何从Firebase数据库Android获取子节点