我对内存管理有点困惑。
我在 java 应用程序中以嵌入模式使用 neo4j。版本 - 1.8.1。JVM 版本 - 1.6
我有一个带有 for 循环的单线程加载程序,其中包含一个嵌套的 for 循环。在外部 for 循环中,我graphDb.beginTx();
从 mysql 获取测试对象的 id 并为此创建一个节点。在内部 for 循环中,我正在查询 mysql 以获取一堆相关对象。我为它们创建节点,以及与我在外部循环中创建的节点的对应关系。
在外部 for 循环结束时,我执行tx.success()
and 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 以更好的方式获得它。
我的理解错了吗?如果是这样,推荐的内存管理最佳实践是什么?
下一步 - 单线程加载器将扩展为多线程加载器,因此,要确保内存管理和事务管理是健壮的。
非常感谢!
问候,
萨钦