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

"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日

相关文章

  • SpringBoot3.0自定stater模块的操作流程(chatGPT提供的49种场景)

    Spring Boot 3.0 自定义 Starter 模块的操作流程 Spring Boot 3.0 是一个快速构建 Spring 应用程序的框架,它提供了许多便利的功能,例如自动配置、嵌入式服务器和健康检查等。在本文中,我们将详细讲解 Spring Boot 3.0 自定义 Starter 模块的操作流程。 什么是 Starter 模块 Starter …

    Java 2023年5月15日
    00
  • 用Maven打成可执行jar,包含maven依赖,本地依赖的操作

    Maven 是一个强大的项目管理工具,可以帮助开发者自动下载和安装项目所需的依赖,并且可以将项目打包成可执行的 jar 文件。下面是用 Maven 将项目打包成可执行的 jar,同时包含 Maven 依赖和本地依赖的操作攻略。 1. 在 pom.xml 文件中配置插件 在 Maven 的 pom.xml 文件中,可以通过配置插件的方式来打包成可执行的 jar…

    Java 2023年5月20日
    00
  • 详解IDEA创建Tomcat8源码工程流程

    下面是详解IDEA创建Tomcat8源码工程流程的完整攻略。 1. 下载并导入Tomcat8源码 首先,需要前往Tomcat官网下载Tomcat8源码,并解压到本地。然后,在IntelliJ IDEA中选择“File” > “New” > “Project from Existing Sources”打开源码文件夹,依次点击“Next”,在询问是…

    Java 2023年5月19日
    00
  • Java日常练习题,每天进步一点点(35)

    下面是完整的攻略: 概述 Java日常练习题是一系列Java练手题,旨在帮助Java初学者熟悉Java语言,加深对Java知识的理解。本篇题目为第35题,难度为中等。 题目描述 写一个Java程序,输入一个字符串,输出其中不重复的字符。 解题思路 我们可以使用HashMap来存储每个字符出现的次数,然后遍历HashMap,输出出现次数为1的字符即可。 以下是…

    Java 2023年5月19日
    00
  • Java Fluent Mybatis 聚合查询与apply方法详解流程篇

    Java Fluent Mybatis 是一个 Mybatis 的扩展项目,它提供了一组高级的 API ,可以让你更加简洁、方便地构建 MyBatis 动态 SQL 查询语句。 Fluent Mybatis 中关于聚合查询的 API 章节是 Fluent-SQL-Query 的一个子集,主要提供了以下三个聚合查询的方法: groupBy: 根据列进行分组 h…

    Java 2023年5月20日
    00
  • tomcat单机多实例的实现

    Tomcat单机多实例的实现是在一台物理服务器上配置多个Tomcat实例,每个实例可以有自己的配置文件、发布目录和端口号,以实现对 Web 应用的快速部署和管理。 下面是实现多实例的详细步骤: 1. 安装 Tomcat 首先需要安装Tomcat,可以到官网下载最新版本,并按照提示进行安装,安装过程很简单,不再赘述。 2. 创建实例目录 在 Tomcat 安装…

    Java 2023年6月2日
    00
  • Java 读取文件方法大全

    Java 读取文件方法大全 在Java中,读取文件是一个非常基础的操作,也是开发中经常用到的操作之一。本文将提供多种Java读取文件的方法,以供读者参考。 1. 使用 BufferedReader import java.io.*; public class ReadFromFile { public static void main(String[] ar…

    Java 2023年5月20日
    00
  • JSP分页显示的实例代码

    JSP分页显示的实例代码需要以下步骤: 1. 准备数据 首先,我们需要准备一些数据,以便在JSP页面中分页显示。可以从数据库中查询相关数据,或者手动设置一些数据。 int pageSize = 5; //每页显示5条数据 int currentPage = 1; //当前页码 List<String> dataList = new ArrayLi…

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