【问题标题】:GraphDB OutOfMemoryError: Java heap spaceGraphDB OutOfMemoryError:Java 堆空间
【发布时间】:2019-03-06 09:02:02
【问题描述】:

我在研究项目中使用 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-Bit Server VM warning:

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f5b4b6d0000, 65536, 1) failed; error='Cannot allocate memory' (errno=12)

请您帮我正确配置 GraphDB Triplestore 以消除堆空间异常?

谢谢。

【问题讨论】:

    标签: graphdb


    【解决方案1】:

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

    我怀疑您的实际问题实际上是在堆内存上分配了太多,这在 RAM 中没有为非堆留出空间。当数据库尝试分配堆外 RAM 时,您会遇到操作系统级别较低的错误“无法分配内存”。

    解决这个问题有两种选择:

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

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

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

    【讨论】:

    • 由于错误与堆空间有关,因此更好的方法是减少页面缓存组件的使用量。默认情况下,它设置为使用最多 50% 的堆,因此 256k-512k 范围内的值应该释放其余的用于其他结构、操作和请求处理。见graphdb.ontotext.com/documentation/standard/…
    • 非常感谢您的建议。设置 GDB_HEAP_SIZE=2048m 就可以了。我们已经执行了一组重负载测试,存储库完全健康。无论如何,我知道您发送的要求和配置文档。但实际上,对于非技术人员来说,很难找到合适的平衡点。所以值得一问,而不是用参数进行无限实验。
    猜你喜欢
    • 2013-01-24
    • 2015-08-25
    • 2021-02-13
    • 2012-10-09
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多