我正在研究项目中使用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?
答案 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