HighPerformanceCache是​​否需要一些特殊操作才能正确关闭?

时间:2014-12-17 17:13:41

标签: 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"

在具有16GB RAM的计算机上将Xmx设置为7G。 问题是,在我们的测试中,我们反复启动和关闭基于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关闭时释放缓存,我的问题与这个事实有关吗?

1 个答案:

答案 0 :(得分:0)

我写了一个快速测试,但无法重现你的发现:

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