JAVA各种OOM代码示例与解决方法

yizhihongxing

"JAVA各种OOM代码示例与解决方法"攻略

什么是OOM

OOM是"Out Of Memory"的缩写,意为内存用尽。Java程序中,如果申请内存超过了JVM所限制的最大内存,则会发生OOM异常。在Java程序中,由于内存泄漏或者分配内存过多导致的OOM异常较为常见。

OOM异常的种类

  1. Java heap space
    JVM使用的java堆内存中没有多余的空间来分配对象。

  2. PermGen space
    Permanent Generation是JVM用来存储元数据和类的信息的区域。Java程序可用的PermGen space固定不变,程序占用的PermGen space不能超过JVM限制的最大值。

  3. GC overhead limit exceeded
    JVM花费的时间在GC上太多,导致程序几乎不能正常工作。

  4. unable to create new native thread
    指的是应用程序创建的时候线程太多,线程数量超过JVM或者操作系统的限制。

  5. requested array size exceeds VM limit
    在JVM中申请的数组大小太大,无法满足需求。

OOM示例

Java heap space

public class JavaHeap {
   public static void main(String args[]) {
      ArrayList<Object> l = new ArrayList<Object>();
      while(true) {
         l.add(new Object());
      }
   }
}

这个程序会不断创建新对象并添加到ArrayList中,最终导致内存耗尽,抛出Java heap space异常。

PermGen space

public class PermGen {
   public static void main(String[] args){
       int i = 0;
       while (true){
            System.out.println(i++);
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(Integer.class);
            enhancer.setUseCache(false);
            enhancer.setCallback(new MethodInterceptor(){
                @Override
                public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                    return methodProxy.invokeSuper(o, args);
                }
            });
            enhancer.create();
       }
    }
}

这个程序利用cglib进行类增强,每次都会产生一个新的类并加载到PermGen space中,最终导致内存耗尽,抛出PermGen space异常。

OOM解决方法

  1. 扩大内存
    可以通过指定JVM启动参数 "-Xmx" 和 "-Xms" 来改变JVM最大和最小可以使用的内存大小。

  2. 优化程序代码
    尝试尽可能地减少内存分配并且及时清理内存,以避免创建过多的对象和内存泄漏。

  3. 使用JVM工具
    可以使用 JVM 内建的工具,比如 jmap、jhat、jstack、visualvm 等来检测程序中的内存泄漏问题,找出内存消耗大量的代码块,以及提高代码效率。

  4. 增加硬件设施
    如果某个程序存在内存耗尽的问题,并且优化程序代码和设置JVM参数的操作都不能解决这个问题,那么可以尝试增加硬件设施,比如安装更大内存的服务器,并且使用多线程来提高程序效率。

以上是关于Java OOM的代码示例和解决方法,希望可以帮助到大家。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA各种OOM代码示例与解决方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 使用maven生成可执行的jar包的方法

    生成可执行的jar包是Maven的一个非常重要的功能, 可以将所有依赖打包成一个jar文件,方便部署和分发应用程序。下面是使用Maven生成可执行的jar包的步骤: 步骤1:创建Maven项目 首先我们需要创建一个Maven项目,并在pom.xml文件中添加插件来生成可执行的jar包。 步骤2:设置Maven插件 在pom.xml文件中添加如下配置,以使用M…

    Java 2023年5月20日
    00
  • Spring Bean注册与注入实现方法详解

    Spring Bean注册与注入实现方法详解 Spring是一个非常流行的Java开发框架,它提供了很多便捷的功能,其中之一就是Bean注册与注入。本文将详细讲解Spring Bean注册与注入的实现方法,包括XML配置、注解配置和Java配置三种方式,并提供两个示例说明。 XML配置 XML配置是Spring最早的配置方式,也是最基础的配置方式。在XML配…

    Java 2023年5月18日
    00
  • 每天练一练Java函数与算法Math函数总结与字符串转换整数

    下面我为您详细讲解“每天练一练Java函数与算法Math函数总结与字符串转换整数”的完整攻略。 攻略简介 该攻略包含了每天练习Java函数和算法方面的内容,以及Java Math函数的总结和字符串转换整数相关的知识点。通过每天练习,可以加深对Java编程基础概念的理解,提高编程能力,同时也能对Math函数和字符串转换整数等方面进行进一步掌握。 每天练一练Ja…

    Java 2023年5月26日
    00
  • Java实现自定义ArrayList类的示例代码

    下面我将详细讲解如何使用Java来实现自定义的ArrayList类的完整攻略。 1. 什么是ArrayList? 在开始编写代码之前,我们需要先了解一下ArrayList是什么。ArrayList是Java集合框架中的一种数据结构,它是基于数组实现的,可以存储任意类型的对象。与数组相比,ArrayList有更多的优点,如可以自动扩容、支持插入、删除操作等。 …

    Java 2023年5月26日
    00
  • JSP 自动刷新的实例详解

    下面是“JSP 自动刷新的实例详解”完整攻略。 一、JSP 自动刷新简述 JSP 自动刷新,是指在 JSP 页面中,不需要手动刷新页面,而是自动刷新页面。这对于需要实时更新数据的应用场景非常实用,比如在线聊天室。 二、JSP 实现自动刷新的方法 JSP 实现自动刷新有两种方法: 1. 使用 HTML 的 meta 标签 <meta http-equiv…

    Java 2023年6月15日
    00
  • java 通过发送json,post请求,返回json数据的方法

    下面是详细讲解 Java 通过发送 JSON,POST 请求返回 JSON 数据的攻略: 1. 背景 我们在 Java 中常常需要通过网络请求来获取数据或者发送数据,HTTP 协议是最常见的应用层协议,而使用 HTTP 协议有两种方式: GET 请求和 POST 请求。GET 请求是通过 URL 传递参数,POST 请求是通过 Request Body 传递…

    Java 2023年5月26日
    00
  • Spring Security登录添加验证码的实现过程

    实现Spring Security登录添加验证码的过程大体可以分为以下几步: 添加验证码依赖 首先需要在pom.xml文件中添加相关依赖,以下是一个基本的配置: <dependency> <groupId>com.google.code.kaptcha</groupId> <artifactId>kaptcha…

    Java 2023年5月20日
    00
  • Jenkins如何实现自动打包部署linux

    Jenkins是一个自动化构建工具,它可以实现自动构建、自动测试和自动部署等功能。下面是实现Jenkins自动打包部署Linux的攻略。 Step 1:安装Jenkins 在Linux系统中,使用apt-get命令来安装Jenkins。在终端中输入以下命令: sudo apt-get install jenkins 安装完成后,可以通过以下命令来启动Jenk…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部