在 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
文件:
现在,我们可以根据系统要求更改 Xmx 值:
现在,重新启动 Eclipse 以解决错误。
使用内存分析器工具处理 Java 中的 OutOfMemoryError 异常
增加堆大小会产生其他问题,但并不能保证解决问题。更好的方法是查看错误所在并相应地解决它。
另一个常见的原因是内存泄漏,如果 JVM 中存在内存泄漏,它也会抛出 OutOfMemoryError。要检查内存泄漏,我们可以使用 IDE 工具。
例如,Eclipse 有 Memory Analyzer Tool (MAT),它可以检查内存泄漏并减少内存消耗。可以从这里下载 MAT。
使用此工具,我们可以分析内存泄漏并解决 OutOfMemoryErorr 错误。
相关文章
如何在 Java 中延迟几秒钟的时间
发布时间:2023/12/17 浏览次数:217 分类:Java
-
本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。
如何在 Java 中把 Hashmap 转换为 JSON 对象
发布时间:2023/12/17 浏览次数:187 分类:Java
-
它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。
如何在 Java 中按值排序 Map
发布时间:2023/12/17 浏览次数:171 分类:Java
-
本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map
进行排序,并列出了一些示例代码来理解它。
如何在 Java 中打印 HashMap
发布时间:2023/12/17 浏览次数:192 分类:Java
-
本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。
在 Java 中更新 Hashmap 的值
发布时间:2023/12/17 浏览次数:146 分类:Java
-
本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。
Java 中的 hashmap 和 map 之间的区别
发布时间:2023/12/17 浏览次数:79 分类:Java
-
本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,
在 Java 中获取用户主目录
发布时间:2023/12/17 浏览次数:218 分类:Java
-
这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。
Java 中 size 和 length 的区别
发布时间:2023/12/17 浏览次数:179 分类:Java
-
这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。
Java 中的互斥锁
发布时间:2023/12/17 浏览次数:111 分类:Java
-
了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,