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

当前,我们在tripplestore中执行很多CRUD操作。

GraphDB在控制台中引发异常:

java.lang.OutOfMemoryError: Java heap space
-XX:OnOutOfMemoryError="kill -9 %p"
Executing /bin/sh -c "kill -9 1411"...

调查过程,GraphDB使用参数XX:MaxDirectMemorySize = 128G运行

即使使用./graph -Xmx3g,我也无法更改,进程仍在使用XX:MaxDirectMemorySize = 128G运行。

我尝试配置./grapdh参数,设置GDB_HEAP_SIZE = 3072m,现在进程使用其他-Xms3072m -Xmx3072m参数运行,但仍为XX:MaxDirectMemorySize = 128G。

更新到GDB_HEAP_SIZE = 3072m后,存储库再次关闭,没有.hprof文件,没有例外,日志中没有可疑的东西。将以下行刷新到控制台:Java HotSpot(TM)64位服务器VM警告:
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f5b4b6d0000, 65536, 1) failed; error='Cannot allocate memory' (errno=12)

请,您能帮我正确配置GraphDB tripplestore摆脱堆空间异常吗?

谢谢。

最佳答案

默认情况下,JVM中-XX:MaxDirectMemorySize(堆外内存)参数的值等于-XMx(堆上内存)。对于非常大的存储库,堆外内存的大小可能变得不足,因此GraphDB开发人员将此参数设置为128GB或无限。

我怀疑您的实际问题实际上是在堆内存上分配了过多的内存,从而在RAM中没有足够的空间用于堆外。当数据库尝试分配堆外RAM时,您遇到此低OS级错误“无法分配内存”。

解决此问题有两种选择:

  • 将服务器的RAM增加到8GB并保持相同的配置-这将允许分配8 GB的RAM:2GB(OS)+ 3GB(在堆上)+ 3GB(在堆外)
  • -Xmx值减小到2GB,以便分配4GB RAM:1GB(OS)+ 2GB(在堆上)+ 1GB(在堆外)

  • 要大致了解RAM GraphDB需要多少内存,请检查硬件大小调整页面:

    http://graphdb.ontotext.com/documentation/8.6/free/requirements.html

    关于graphdb - GraphDB OutOfMemoryError:Java堆空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52587944/

    10-12 02:38