知识库

内存溢出 (OOM) 错误后的恢复建议

可以对 JVM(Java 虚拟机)进行配置,使其在遇到 OOM(内存不足)错误时强制抛出异常并崩溃,或直接关闭应用程序。首次出现 OOM 时采取措施可以帮助避免后续因内存不足而受到影响的实例,减少恢复时间。此外,重新启动应用程序并重试这些操作后,因内存占用变化,先前因 OOM 失败的操作可能得以成功完成。如果诊断问题是首要任务,建议选择 CrashOnOutOfMemoryError 而不是 ExitOnOutOfMemoryError。

CrashOnOutOfMemoryError

如果启用此选项,当出现内存不足错误时,JVM 将崩溃并生成文本和二进制崩溃文件(如果已启用 core 文件)。

格式
-XX:+|-CrashOnOutOfMemoryError
示例
java -XX:+CrashOnOutOfMemoryError
Neo4j 配置文件(neo4j.conf)条目
dbms.jvm.additional=-XX:+CrashOnOutOfMemoryError

ExitOnOutOfMemoryError

启用此选项后,JVM 会在第一次出现内存不足错误时退出。如果您更倾向于重启 JVM 实例而不是处理内存不足错误,可以使用此方式。

格式
-XX:+|-ExitOnOutOfMemoryError
Neo4j 配置文件(neo4j.conf)条目
dbms.jvm.additional=-XX:+ExitOnOutOfMemoryError

-XX:+ExitOnOutOfMemoryError 优先于 -XX:+CrashOnOutOfMemoryError

ExitOnOutOfMemoryErrorCrashOnOutOfMemoryError 标志在 Java SE 8 Update 92 中加入。更多信息请参阅 8u92 更新发行说明 中的 “New JVM Options” 部分。

OutOfMemoryError 有多种类型

  • java.lang.OutOfMemoryError: Java heap space

当应用尝试向堆空间添加更多数据,但空间不足时会触发此错误。即使物理内存充足,只要 JVM 达到堆大小上限,也会抛出 java.lang.OutOfMemoryError: Java heap space 错误。

  • java.lang.OutOfMemoryError: GC overhead limit exceeded

此错误表示 GC 试图回收内存,但几乎没有任何效果。默认情况下,当 JVM 在 GC 上花费超过 98% 的总时间,并且 GC 后堆回收率不足 2% 时,会抛出该错误。

  • java.lang.OutOfMemoryError: Metaspace/Compressed class space

此错误的主要原因是加载到 Metaspace 的类过多或类体积过大。

  • java.lang.OutOfMemoryError: Unable to create new native thread

当底层操作系统无法分配新的本机线程时,会抛出此 OutOfMemoryError。本机线程的具体限制高度依赖于平台。

  • java.lang.OutOfMemoryError: Out of swap space?

当从本机堆请求字节分配失败且本机堆接近耗尽时,JVM 会抛出此错误。通常是由操作系统层面的因素导致,例如

  • 操作系统配置的 swap 空间不足。

  • 系统上的其他进程已消耗全部内存资源。

    • java.lang.OutOfMemoryError: Requested array size exceeds VM limit

这表示导致崩溃的应用尝试分配的数组大小超出 Java 虚拟机能够支持的上限。

© . This site is unofficial and not affiliated with Neo4j, Inc.