内存溢出错误恢复建议
可以将 JVM (Java Virtual Machine) 配置为在遇到 OOM (Out-Of-Memory) 错误时强制抛出异常并崩溃,或仅关闭应用程序。在第一次 OOM 发生时采取行动有助于避免低内存情况下可能因内存需求遇到 OOM 的进一步受害者,并缩短恢复时间。此外,由于内存占用已改变,在重启应用程序并重试此类操作后,这可能实际上允许由于 OOM 而失败的操作成功完成。如果诊断问题是首要任务,则优先选择 CrashOnOutOfMemoryError 而非 ExitOnOutOfMemoryError。
CrashOnOutOfMemoryError
如果启用此选项,当发生内存溢出错误时,JVM 将崩溃并生成文本和二进制崩溃文件(如果核心文件已启用)。
-XX:+|-CrashOnOutOfMemoryError
java -XX:+CrashOnOutOfMemoryError
dbms.jvm.additional=-XX:+CrashOnOutOfMemoryError
ExitOnOutOfMemoryError
启用此选项后,JVM 会在第一次发生内存溢出错误时退出。如果您更倾向于重启 JVM 实例而不是处理内存溢出错误,则可以使用此选项。
-XX:+|-ExitOnOutOfMemoryError
dbms.jvm.additional=-XX:+ExitOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
优先于 -XX:+CrashOnOutOfMemoryError
。
ExitOnOutOfMemoryError 和 CrashOnOutOfMemoryError 标志已添加到 Java SE 8 Update 92 中。有关更多信息,请参阅 8u92 更新发布说明中的“新 JVM 选项”部分。
JDK-8155004:CrashOnOutOfMemoryError 不适用于因无法创建线程引起的 OOM |
OutOfMemoryError 有多种类型
-
java.lang.OutOfMemoryError: Java heap space
当应用程序尝试向堆空间区域添加更多数据但空间不足时,会触发此错误。请注意,可能存在大量物理内存可用,但当 JVM 达到堆大小限制时,就会抛出 java.lang.OutOfMemoryError: Java heap space 错误。
-
java.lang.OutOfMemoryError: GC overhead limit exceeded
此错误意味着垃圾回收器 (GC) 尝试释放内存,但几乎未能完成任何工作。默认情况下,当 JVM 花费超过总时间的 98% 进行 GC,并且在 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 会抛出此错误。它通常由操作系统级别的问题引起,例如:
-
操作系统的交换空间配置不足。
-
系统上的另一个进程正在消耗所有内存资源。
-
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
-
这意味着发生此错误并崩溃的应用程序正尝试分配一个大于 Java 虚拟机支持大小的数组。
来源. |
此页对您有帮助吗?