高性能缓存是否需要一些特殊操作才能正确关闭

  • 本文关键字:操作 是否 缓存 高性能 neo4j
  • 更新时间 :
  • 英文 :


在我的应用程序中,我使用以下配置(相关部分(:

"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();
    }
}

最新更新