我在研究项目中使用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级错误“无法分配内存”。
解决此问题有两种选择:
-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/