在 Java 中处理 OutOfMemoryError 异常

JVM 无法在堆空间中分配对象时抛出 OutOfMemoryError 异常。堆空间用于存储运行时创建的对象。

JVM 中有两个不同的空间部分,Permgen 和 Heap Space。本教程描述 OutOfMemoryError 异常并演示如何处理它。

Java 中的 OutOfMemoryError 异常

当 Java 虚拟机发现没有足够的内存用于在堆空间中存储新对象时,它会抛出 OutOfMemoryError。

当用户做错事时抛出 OutOfMemoryError。例如,用户试图通过长时间持有对象来处理高数据。

当用户无法处理捕获字符串的第三方库或部署后未清理的应用程序服务器时,这也可能是一个错误。

本机库代码也可能引发此错误;例如,当交换空间不足时,无法满足本地分配。

例子:

package delftstack;
public class Out_Of_Memory_Error{
    public void Out_Of_Memory_Array(int array_size) {
        try {
            Integer[] Demo_Array = new Integer[array_size];
        }
        catch (OutOfMemoryError e) {
            System.err.println("Array size is too large for memory");
            System.err.println("The Maximum JVM memory is : " + Runtime.getRuntime().maxMemory());
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        Out_Of_Memory_Error demo = new Out_Of_Memory_Error();
        demo.Out_Of_Memory_Array(1000000000);
    }
}

这段代码尝试创建一个长度为 1000000000 的数组,这对于 JVM 来说是不可能的,因为它会耗尽内存。输出将显示 JVM 内存和错误。

输出:

Array size is too large for memory
The Maximum JVM memory is : 1046478848
java.lang.OutOfMemoryError: Java heap space
    at delftstack.Out_Of_Memory_Error.Out_Of_Memory_Array(Out_Of_Memory_Error.java:6)
    at delftstack.Out_Of_Memory_Error.main(Out_Of_Memory_Error.java:17)

处理 Java 中的 OutOfMemoryError 异常

一旦我们知道导致 OutOfMemoryError 的原因,我们就可以修复它,以便 JVM 可以将对象存储在 Java 堆空间中。下面我们来看看 java.lang.OutOfMemoryError 不同原因的不同解决方案。

使用 -Xmx 选项处理 Java 中的 OutOfMemoryError 异常

OutOfMemoryError 最常见的原因是 Java 虚拟机堆空间的大小。IDE 可以使用 -Xmx 选项解决此问题。

此配置将堆空间增加到 1024 大小。但是,增加堆大小并不能保证解决所有错误,例如内存泄漏错误。

堆空间大小的增加也会增加 GC 的长度。让我们看看如何解决堆大小问题。

当我们使用 Eclipse IDE 时,从安装文件夹中打开 eclipse.ini 文件:

在 Java 中处理 OutOfMemoryError 异常

现在,我们可以根据系统要求更改 Xmx 值:

在 Java 中处理 OutOfMemoryError 异常

现在,重新启动 Eclipse 以解决错误。

使用内存分析器工具处理 Java 中的 OutOfMemoryError 异常

增加堆大小会产生其他问题,但并不能保证解决问题。更好的方法是查看错误所在并相应地解决它。

另一个常见的原因是内存泄漏,如果 JVM 中存在内存泄漏,它也会抛出 OutOfMemoryError。要检查内存泄漏,我们可以使用 IDE 工具。

例如,Eclipse 有 Memory Analyzer Tool (MAT),它可以检查内存泄漏并减少内存消耗。可以从这里下载 MAT。

在 Java 中处理 OutOfMemoryError 异常

使用此工具,我们可以分析内存泄漏并解决 OutOfMemoryErorr 错误。