当前位置: 首页 > 编程笔记 >

什么是OutOfMemoryError以及查找Java中OOM根本原因的步骤?

施刚毅
2023-03-14
本文向大家介绍什么是OutOfMemoryError以及查找Java中OOM根本原因的步骤?,包括了什么是OutOfMemoryError以及查找Java中OOM根本原因的步骤?的使用技巧和注意事项,需要的朋友参考一下

OutOfMemoryError异常 被抛出JVM,当JVM没有足够的可用内存,来分配。OutOfMemoryError Exception 类层次结构中属于E rror类别

产生OutOfMemoryError

  • 我们将分配大量内存,这将耗尽内存的存储空间

  • 我们将继续分配内存并达到目标,当JVM没有足够的内存来分配时,将抛出OutOfMemoryError 

  • 一旦我们捕获到OutOfMemory 错误,就可以记录该错误。

示例

public class OutOfMemoryErrorDemo {
   public static void main(String[] args) throws Exception {
      int dummyArraySize = 15;
      System.out.println("Max JVM memory: " + Runtime.getRuntime().maxMemory());
      long memoryConsumed = 0;
      try {
         long[] memoryAllocated = null;
         for(int loop = 0; loop < Integer.MAX_VALUE; loop++) {
            memoryAllocated = new long[dummyArraySize];
            memoryAllocated[0] = 0;
            memoryConsumed += dummyArraySize * Long.SIZE;
            System.out.println("Memory Consumed till now: " + memoryConsumed);
            dummyArraySize *= dummyArraySize * 2;
            Thread.sleep(500);
         }
      } catch (OutOfMemoryError outofMemory) {
         System.out.println("Catching out of memory error");
         //记录信息,以便我们可以生成统计信息
         throw outofMemory;
      }
   }
}

输出结果

Max JVM memory: 119537664
Memory Consumed till now: 960
Memory Consumed till now: 29760
Memory Consumed till now: 25949760
Catching out of memory error
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at OutOfMemoryErrorDemo.main(OutOfMemoryErrorDemo.java:9)


查找OOM根本原因的步骤

步骤1:在OutOfMemoryError上生成堆转储

使用VM参数-XX:+ HeapDumpOnOutOfMemoryError启动应用程序。这将告诉JVM在发生OOM时产生堆转储

$ java -XX:+HeapDumpOnOutOfMemoryError ...

步骤2:重现问题

如果我们不能在开发环境中重现问题,则可能必须使用生产 环境。当我们重现问题并且应用程序引发OOM时,它将生成一个堆转储文件。

步骤3:使用堆转储文件调查问题

使用VisualVM 读取堆转储文件并诊断问题。VisualVM 是位于JDK_HOME / bin / jvisualvm中的程序。该堆转储文件具有有关应用程序的内存使用情况的所有信息。

 类似资料:
  • 问题描述: 我在尝试将springboot应用集成到另一个容器中时候,计划是将springboot应用的日志统一到另一个容器中进行管理,所以,特别处理了下springboot org.springframework.boot.loader.LaunchedURLClassLoader 的委托加载关系,将若干日志package委托 parent加载: 比如: 由于遗漏了 ch.qos.logback

  • 我试图找出哪个方法/循环在我的应用程序中给了Java . lang . out of memory error:Java堆空间。我对使用Eclipse Memory Analyzer分析java应用程序还很陌生。 在图像中,很明显调用JNI本地具有最大保留堆,但我们的应用程序中没有任何JNI调用。 请检查并确认内存泄漏是由调用任何本机代码(JNI Local)还是使用任何字符串迭代或其他原因引起的

  • 主要内容:前言,查询慢深层次原因揭秘:磁盘IO的过程,磁盘的顺序读写和随机读写,磁盘IO到底会有多慢呢?,用户查询请求慢的根本原因前言 接上一节,那么,一次查询的全过程是什么样的呢? 这个时候,我们通过各种百度和Google,然后加上自己的理解,终于搞明白了MySQL一次查询的全过程了。 首先,用户想要查询订单数据时,会先发送一个查询请求,如下图所示: 可以看到,当用户发送查询请求时,因为外卖订单项目是部署在Tomcat中的,Tomcat中的线程首先就会接收到用户的请求,然后把请求交给外卖订单项

  • 问题内容: 当我尝试运行程序时,出现以下错误 请帮忙 问题答案: 从Javadoc: 如果Java虚拟机找不到声明为native的方法的适当本机语言定义,则抛出该异常。 这是与JNI相关的错误。loadJacobLibrary试图加载名为jacob-1.14.3-x86的本机库,但在java.library.path定义的路径上找不到该库。启动JVM时,应将此路径定义为系统属性。例如 在Windo

  • 在这里抛出RejectedExecutionException是否有其他原因? java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.FutureTask@4194a5f0被java.util.concurrent.ThreadPoolExecutor@41a36e90拒绝[终止,池大小=0,活动线程=0,排队

  • 问题内容: 我有这个小代码,用于将我的jsp连接到我的mysql数据库。 我已将连接器添加到我的构建路径中: 但我仍然收到此错误: java.lang.ClassNotFoundException:com.mysql.jdbc.Driver 有人可以帮我吗? 问题答案: 构建路径用于编译目的(假设您没有将mysql连接器jar包含在软件包中的代码)。 如果这是Web应用程序,请将其添加到lib文件