在我的申请中,我使用以下配置(相关部分):
"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关闭时释放缓存,我的问题与这个事实有关吗?
答案 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();
}
}