gpt4 book ai didi

java - Neo4j Java API : GC overhead limit exceeded after running multiple queries

转载 作者:行者123 更新时间:2023-11-29 02:59:37 25 4
gpt4 key购买 nike

我在 Java 中使用 Neo4j 2.3.0。我有 16 GB RAM,在 MAC OSX 笔记本电脑上运行代码,使用“-Xmx12g -Xms12g”作为 VM 参数。

我在 Neo4j Java API 中遇到了“超出 GC 开销限制”的问题。

为了对大量查询进行实验,我有一个程序可以在不同的 query.db 上打开一个事务,并从我自己的框架中获取答案,该框架包含在一个对象中(它运行一个查询并打印它的文件中的运行时间)。

因此,为了运行查询,我不使用 Cypher

对于每个查询,我在 query.db 和 data.db 上打开两个事务,初始化我的框架并运行它。内存使用量略有增加,“GC 开销”终于发生了。

try (Transaction txG = knowledgeGraph.beginTx()) {
try (Transaction txQ = queryGraph.beginTx()) {
MyObj myFramework = new MyObj();
printTheResultsIntoTheFile(framework.run());
myFramework =null;
txQ.success();
txQ.close();

这些是我为消除此错误所做的一些努力:

  1. 在我使用监控程序转储堆后,我发现这个“org.neo4j.io.pagecache.impl.muninn.MuninnPageCache”因此,我尝试设置页面缓存大小并将其限制为较小的值:

    dataGraph = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(MODELGRAPH_DB_PATH)
    .setConfig(GraphDatabaseSettings.pagecache_memory, "500M").newGraphDatabase();

但是,“内存泄漏”的问题依然存在。

  1. tx.success() 之后, 我调用 tx.close()以确保它不使用内存。

  2. 在使用我的框架(对象)查找查询的答案后,我明确地将其设置为 null。 topkFramework=null;

  3. 我调用 System.gc();System.runFinalization();

  4. 我将所有静态变量(如 MyCacheServer 或 MyNeighborIndexer)更改为非静态变量,并且在每个查询中,我都明确了它们,并将它们显式设置为 null。

    queryNodeIdSet.clear();
    queryNodeIdSet = null;
    queryNodeIdSet = new HashSet<Long>();

最佳答案

在深入研究 Neo4j 之后,我发现它与一个接一个地创建大量查询图有关。尽管我在每次查询后都调用了 db.shutdown() ,但缓存似乎不会为空。

smallGraph = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(graphPath)
.setConfig(GraphDatabaseSettings.pagecache_memory, "240k").newGraphDatabase();

我已添加此配置并将其设置为可能的最小数量。现在内存泄漏并不会破坏我的进程。在运行大约 1000 个查询后,它仍在运行。早些时候,它在运行 200 个查询后耗尽了我的所有内存 (12 GB)。

这是我的堆栈跟踪:

Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded

at org.neo4j.io.pagecache.impl.muninn.MuninnPageCache.<init>(MuninnPageCache.java:246)

at org.neo4j.kernel.impl.pagecache.ConfiguringPageCacheFactory.createPageCache(ConfiguringPageCacheFactory.java:96)

at org.neo4j.kernel.impl.pagecache.ConfiguringPageCacheFactory.getOrCreatePageCache(ConfiguringPageCacheFactory.java:87)

at org.neo4j.kernel.impl.factory.PlatformModule.createPageCache(PlatformModule.java:277)

at org.neo4j.kernel.impl.factory.PlatformModule.<init>(PlatformModule.java:154)

at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.createPlatform(GraphDatabaseFacadeFactory.java:181)

at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.newFacade(GraphDatabaseFacadeFactory.java:124)

at org.neo4j.kernel.impl.factory.CommunityFacadeFactory.newFacade(CommunityFacadeFactory.java:43)

at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.newFacade(GraphDatabaseFacadeFactory.java:108)

at org.neo4j.graphdb.factory.GraphDatabaseFactory.newDatabase(GraphDatabaseFactory.java:129)

at org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:117)

at org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:185)

at org.neo4j.graphdb.factory.GraphDatabaseFactory.newEmbeddedDatabase(GraphDatabaseFactory.java:79)

at org.neo4j.graphdb.factory.GraphDatabaseFactory.newEmbeddedDatabase(GraphDatabaseFactory.java:74)

关于java - Neo4j Java API : GC overhead limit exceeded after running multiple queries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35876057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com