我在具有 32GB 内存的机器上使用 IoTDB,并将 JVM 最大内存设置iotdb_env.sh如下:
MAX_HEAP_SIZE = 25G
然而,经过两个小时的数据摄取,我发现 IoTDB 已经使用了 31GB 内存,很快就会被 OOM Killer 杀死。为什么 IoTDB 可以使用比 更多的内存MAX_HEAP_SIZE?
我在具有 32GB 内存的机器上使用 IoTDB,并将 JVM 最大内存设置iotdb_env.sh如下:
MAX_HEAP_SIZE = 25G
然而,经过两个小时的数据摄取,我发现 IoTDB 已经使用了 31GB 内存,很快就会被 OOM Killer 杀死。为什么 IoTDB 可以使用比 更多的内存MAX_HEAP_SIZE?
在jvm中,内存分为堆内存和非堆内存。您可以参考这个问题以获取更多详细信息: Java Non Heap Memory 和 Stack Memory 有什么区别?它们是否相同,如果不同,它们之间有什么区别? IoTDB 使用一些使用非堆内存的直接缓冲区。所以总内存使用量将超过 MAX_HEAP_SIZE。您可以在“iotdb_env.sh”中使用以下参数来控制非堆内存:
MAX_DIRECT_MEMORY_SIZE = 5G
您需要确保 MAX_HEAP_SIZE + MAX_DIRECT_MEMORY_SIZE < 总内存以避免 OOM 杀手杀死您的 IoTDB。