首页 > 编程语言 >如何处理 Java 中的 OutOfMemoryError 异常

如何处理 Java 中的 OutOfMemoryError 异常

时间:2023-02-16 00:44:34浏览次数:30  
标签:lang Java 内存 JVM OutOfMemoryError java 异常

java.lang.OutOfMemoryError是Java中的一个运行时错误,它通常发生在Java虚拟机(JVM)由于Java堆内存不足而无法分配对象时。Java垃圾回收器(GC)无法释放新对象所需的空间,从而导致java.lang.OutOfMemoryError。当本地内存不足以支持加载Java类时,也会抛出此错误。

导致 OutOfMemoryError 的原因

导致java.lang.OutOfMemoryError的原因是JVM的内存管理方案在堆内存中设置一部分用于存储新分配的对象。任何被引用的对象在它们的生命周期中(直到它们的引用被关闭)都会保留在堆中并占用内存。当对象不再被引用时,它们变得可以由GC删除并释放占用的堆内存。

Java堆大小由两个JVM属性确定,可以在启动Java时设置:

-Xms 设置初始堆大小
-Xmx 设置最大堆大小
Java应用程序使用的堆内存量影响可以分配的对象数量及其大小。如果一个对象需要的内存超过堆中可用的内存,则应用程序可能会遇到java.lang.OutOfMemoryError。

java.lang.OutOfMemoryError通常意味着应用程序中存在问题 - 例如,应用程序代码正在引用太长时间的大型对象或尝试一次处理大量数据。问题也可能存在于应用程序中使用的第三方库中。

 

OutOfMemoryError 的例子

 

下面是一个由于Java堆空间不足而抛出java.lang.OutOfMemoryError的示例:

public class OutOfMemoryErrorExample {
    public static void main(String[] args) {
        Integer[] myArray = new Integer[1000 * 1000 * 1000];
    }
}

在这个例子中,这段代码尝试初始化一个非常大的 Integer 数组。由于Java堆内存不足以分配这个数组,因此抛出了一个 java.lang.OutOfMemoryError: Java heap space 异常

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at OutOfMemoryErrorExample.main(OutOfMemoryErrorExample.java:8)

在过度使用终结器的应用程序中,也可能出现java.lang.OutOfMemoryError:Java heap space。如果一个类有一个finalize()方法,GC不会清除该类的任何对象,而是将它们排队进行终结器处理,这将在稍后进行。如果终结器线程无法跟上终结器队列(由于终结器的过度使用),则Java堆空间可能会填满,并且可能发生java.lang.OutOfMemoryError。

 

 如何捕获 java.lang.OutOfMemoryError 异常

由于java.lang.OutOfMemoryError是Throwable类的子类,因此可以在应用程序代码中捕获和处理它。在某些情况下,特别是当已知可能导致OutOfMemoryError的代码行时,处理错误可能是个好主意。如果可能的话,最佳实践是清理资源,记录失败原因并正常退出程序。以下是一个示例:

 
public class OutOfMemoryErrorExample {
    public void createArray(int size) {
        try {
            Integer[] myArray = new Integer[size];
        } catch (OutOfMemoryError oome) {
            //Log the info
            System.err.println("Array size too large");
            System.err.println("Max JVM memory: " + Runtime.getRuntime().maxMemory());
        }
    }

    public static void main(String[] args) {
        OutOfMemoryErrorExample oomee = new OutOfMemoryErrorExample();
        oomee.createArray(1000 * 1000 * 1000);
    }
}

 

在这种情况下,由于已知可能导致OutOfMemoryError的代码行,因此它被处理在try-catch块中,并记录了错误原因(数组的大小过大)以及JVM的最大大小,这有助于方法的调用者采取纠正措施。程序退出并显示以下消息:

 
Array size too large
Max JVM memory: 4294967296

 

如果应用程序需要在发生错误时保持一致状态,处理OutOfMemoryError也是个好主意。这样,如果不尝试分配新对象,程序就可以继续正常运行。

         

标签:lang,Java,内存,JVM,OutOfMemoryError,java,异常
From: https://www.cnblogs.com/pknvthebest/p/how-to-handle-java-out-of-memory-error.html

相关文章

  • Java类加载的执行过程
    类加载分为以下5个步骤:1.加载:根据查找路径找到相应的class文件然后导入;2.检查:检查加载的class文件的正确性;3.准备:给类中的静态变量分配内存空间;4.解析:虚拟......
  • java数组
    java数组相同类型数据的有序集合数组的建立定义数组//数据类型[]变量名=赋值//数据类型变量名[]=赋值声明建立//定义数组int[]num;//声明建立num=ne......
  • Java 8新特性之 Optional 类
    前言java.util.Optional是java8中引进的一个新的类,我们通过Optional类的源码可以看到,该方法的作用可以对可能缺失的值进行建模,而不是直接将null赋值给变量。Optional类......
  • JS笔记(四):面向对象、异常处理
    镇楼图Pixiv:torino六、JS中的面向对象类(class)博主视为你已拥有相关基础,这里不再赘述相关概念类的语法如下,class在本质上是function,可以说class只是针对构造器的......
  • JavaWeb文件上传(感谢狂神)
    1、准备工作采用Apache的开源工具common-fileupload这个文件上传组件。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。(这两个jar包需要下载引入,Tomc......
  • Java基础语法
    Java基础语法注释注释是不会执行的,而是给写代码的人看的。分为单行注释、多行注释、文档注释。单行注释://注释内容多行注释:/*注释内容*/文档注释(JavaDoc)......
  • Java Lambda
    JavaLambda输出符合表达式的每一个对象employees.stream().filter(p->p.getAge()>21).forEach(System.out::println);返回一个符合表达式的集合employees.st......
  • Java编译异常捕捉与上报笔记
    异常处理机制的作用:增强程序的健壮性处理编译异常方式一:在方法声明位置上使用throws关键字抛出,谁调用该方法,就交给谁处理注意:为Exception的是需要处理的,否则编译器会报......
  • 学习笔记分享:java面试(JDK、JRE、JVM的区别)
    简答题、问答题:1.JDK、JRE、JVM的区别:1)JDK:java开发工具包,是java的核心,包括:JRE+编译、运行等命令工具2)JRE:java运行环境,是运行java程序所必须的环境集合,包括:JVM+......
  • java-studyDay03-面向对象
    生成Java帮助文档:命令格式:javadoc–d文件夹名–auther–version*.java//格式/***类描述*@author作者名*@versio......