在我的应用程序中,我使用以下配置(相关部分(:
"org.neo4j.server.database.mode" : "HA",
"neostore.nodestore.db.mapped_memory" : "20M", "neostore.relationshipstore.db.mapped_memory" : "40M", "neostore.propertystore.db.mapped_memory" : "60M",
"neostore.propertystore.db.strings.mapped_memory" : "40M",
"neostore.propertystore.db.arrays.mapped_memory" : "40M",
"cache_type" : "hpc",
"cache.memory_ratio" : "60.0"
在具有 7GB RAM 的计算机上将 Xmx 设置为 16G。问题是,在我们的测试过程中,我们反复启动和关闭基于 neo4j 的应用程序,似乎即使在我调用db.shutdown()
之后,缓存仍然没有被清除或释放或任何它的名字。使用Eclipse MAT,我发现了这一点:
2 instances of "org.neo4j.kernel.impl.cache.HighPerformanceCache",
loaded by "sun.misc.Launcher$AppClassLoader @ 0x6ca4755a8"
occupy 137,442,768 (13.03%) bytes.
Biggest instances:
org.neo4j.kernel.impl.cache.HighPerformanceCache @
0x708c74ed0 - 68,721,384 (6.51%) bytes.
org.neo4j.kernel.impl.cache.HighPerformanceCache @
0x708d7e570 - 68,721,384 (6.51%) bytes.
在我们的测试中,我们正确地关闭了每个使用 neo4j 的应用程序(我重新检查了它,我完全确定(,并且在大约 20 次运行后,这些HaCaches
实例占用所有可用的堆并使 JVM 崩溃。
这很重要,那么 JVM 实际上并没有在连续测试运行之间关闭,所以我想如果缓存仅在 JVM 关闭时释放,我的问题与此事实有关?
我写了一个快速测试,但无法重现您的发现:
public class HPCLeakTest {
public static void main(String[] args) throws InterruptedException, IOException {
for (int i=0;i<10;i++) {
GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder("target/hpc-test").setConfig("cache_type", "hpc").newGraphDatabase();
try (Transaction tx = db.beginTx()) {
Node n = db.createNode();
db.getNodeById(n.getId());
tx.success();
}
db.shutdown();
System.gc();
Thread.sleep(1000);
System.out.println("done, run " + i);
}
System.out.println("Done, awaiting input");
System.in.read();
}
}