如何正确配置GraphDb内存

时间:2018-08-30 10:40:52

标签: graphdb

我正在研究项目中使用GraphDb Free 8.6.1,我正在具有4GB内存的linux服务器上以默认配置运行它。

但是,它已经开始引发指向内存不足的异常:

Caused by: org.eclipse.rdf4j.repository.RepositoryException: Query evaluation error: Insufficient free Heap Memory 238Mb for group by and distinct, threshold:250Mb, reached 0Mb (HTTP status 500)
    at org.eclipse.rdf4j.http.client.SPARQLProtocolSession.execute(SPARQLProtocolSession.java:1143)
    at org.eclipse.rdf4j.http.client.SPARQLProtocolSession.executeOK(SPARQLProtocolSession.java:1066)
    at org.eclipse.rdf4j.http.client.SPARQLProtocolSession.sendTupleQueryViaHttp(SPARQLProtocolSession.java:834)
    at org.eclipse.rdf4j.http.client.SPARQLProtocolSession.getTupleQueryResult(SPARQLProtocolSession.java:763)
    at org.eclipse.rdf4j.http.client.SPARQLProtocolSession.sendTupleQuery(SPARQLProtocolSession.java:391)
    at org.eclipse.rdf4j.repository.http.HTTPTupleQuery.evaluate(HTTPTupleQuery.java:69)

请,您能帮我找出问题吗? 如何正确配置GraphDB?

2 个答案:

答案 0 :(得分:2)

您观察到的行为是操作唯一/分组的内存优化的一部分。错误消息本身与默认阈值250 mb有关,可以让您知道需要调整内存。当可用的堆内存小于阈值时,将抛出QueryEvaluationException,以避免由于饥饿的区分/分组操作而耗尽内存。您可以通过在启动GraphDB“ -Ddefaut.min.distinct.threshold = XXX”时通过传递以下参数来减少阈值,从而调整阈值以最小化这些错误(可以将阈值设置为以字节为单位的内存量)

Insufficient free Heap Memory 238Mb for group by and distinct, threshold:250Mb, reached 0Mb
238Mb = free heap space reported by the JVM
250Mb = the default threshold below which the protection should raise an exception to prevent OME
0Mb = the current buffer used for distinct and group by

我怀疑其他操作会占用您的大部分RAM,一旦您运行任何DISTINCT / GROUP BY查询,由于受到OME保护,它会立即停止。

答案 1 :(得分:0)

这个答案对我有帮助。

例如,如果您的计算机具有32 GB RAM:

/opt/graphdb-free/app/graphdb-free.cfg(抠图)

[JVMOptions]
-Xms20G
-Xmx20G
-XX:PermSize=4G
-XX:MaxPermSize=4G
-Dfile.encoding=UTF-8
-Djava.net.preferIPv4Stack=true
--add-exports
jdk.management.agent/jdk.internal.agent=ALL-UNNAMED
--add-opens
java.base/java.lang=ALL-UNNAMED

通过GUI和设置:

graphdb.page.cache.size    10G