首页 > 其他分享 >遇到OOM之后应该怎么办?

遇到OOM之后应该怎么办?

时间:2023-05-25 16:47:18浏览次数:21  
标签:java dump temp 遇到 OOM OOM1 内存 怎么办

OOM产生的原因

OOM 可能产生的原因有以下几种:

  1. 内存泄漏:内存泄漏是指程序中未被使用的对象仍然占用着内存空间,导致内存无法被垃圾回收机制回收。当程序中存在大量的内存泄漏时,就会导致内存不足。

  2. 内存分配不当:如果程序中分配的内存过多或者在不需要的时候没有及时释放,就会导致内存不足。

  3. 堆内存空间不足:Java 中的对象都是在堆内存中创建的,如果程序中的对象过多或者对象本身特别大,就可能导致堆内存空间不足。

  4. 栈内存空间不足:虽然 Java 中的对象是在堆内存中创建的,但是每个线程都有自己的栈空间。如果栈中的局部变量和方法调用过深,就可能导致栈空间不足,从而导致程序出现内存溢出。

遇到OOM之后应该怎么办?

构造一个简单的OOM程序

import java.util.*;

public class OOM {
    public static void main(String[] args) {
        Map<Integer,Object> cache = new HashMap<>();
        for (int i = 0; i < 128; i++) {
            cache.put(i,new Byte[1024*1024]);
        }
    }
}

运行一下

➜  temp javac OOM.java
➜  temp java -Xmx128m OOM
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at OOM.main(OOM.java:7)

先想办法拿到Heap Dump

  • -XX:+HeapDumpOnOutOfMemoryError

在java启动之前添加参数-XX:+HeapDumpOnOutOfMemoryError,当JVM发生OOM时候,自动生成dump文件

➜  temp java -Xmx128m -XX:+HeapDumpOnOutOfMemoryError OOM
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid87626.hprof ...
Heap dump file created [211236627 bytes in 0.089 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at OOM.main(OOM.java:7)
➜  temp ls
OOM.class           OOM.java            java_pid87626.hprof
  • jmap -dump:live,format=b,file=

将运行中java程序的堆快照dump出来,先改造一下上面的OOM程序

import java.util.*;

public class OOM1 {
    public static void main(String[] args) throws Exception{
        Map<Integer,Object> cache = new HashMap<>();
        for (int i = 0; i < 128; i++) {
            Thread.sleep(1000);
            cache.put(i,new Byte[1024*1024]);
        }
    }
}

运行OOM1

➜  temp java -Xmx128m OOM1

在上面OOM1程序运行过程中开一个新的terminal,拿到OOM1程序的pid之后通过jmap命令将快照dump到该目录下

➜  temp jps -l
29168
80485
88777 OOM1
88812 jdk.jcmd/sun.tools.jps.Jps
➜  temp jmap -dump:live,format=b,file=`pwd`/88777.hprof 88777
Dumping heap to /Users/chinese.youth/temp/88777.hprof ...
Heap dump file created [127351113 bytes in 0.074 secs]
➜  temp ls
88777.hprof         OOM.class           OOM.java            OOM1.class          OOM1.java           java_pid87626.hprof

Heap Dump 分析

MetaSapce/PermGen

java.lang.OutOfMemoryError: Prem Gen

java.lang.OutOfMemoryError: Metaspace

在java7和java7之前class对象都是放在永久代中,在java8之后class对象放在元空间中

这个空间溢出的时候基本可以确定是因为某些class对象没有被释放,很大原因可能是类加载器的泄漏。

检查JVM元空间设置参数是否过小:-XX:MetaspaceSize=10M -XX:MaxMetaspaceSize=10M

Heap Space

java.lang.OutOfMemoryError: Java heap space

瞄准占用空间最大的对象

堆溢出原因

  • 无法在java堆中分配对象
  • 应用程序保存了无法被GC回收的对象

可以使用JProfiler工具对dump出来的存储快照进行分析

  • 如果是内存泄漏,通过工具查看对象到GC Root的引用链,修复程序内存泄漏
  • 如果不存在内存泄漏,可以检查程序是否存在死循环、递归等操作

分析工具

  • MAT
  • VisualVM
  • JProfiler (收费)

标签:java,dump,temp,遇到,OOM,OOM1,内存,怎么办
From: https://www.cnblogs.com/keepsilence233/p/17431766.html

相关文章

  • vue遇到的问题
     这个是eslint的报错,严格模式下的话不会允许未使用的字段存在两个解决方案,要么把定义但是没用到的东西输出(console.log(参数)),要么就关闭严格模式 项目下看看有没有.eslintrc.js文件把这个配置改一下然后重新运行一下 没有这个文件的话就找找package.json里面的eslint配......
  • firefox旧版本下载后打开为为最新版怎么办
    firefox默认自动更新为最新版,一定要注意!!!问题描述:我有一个最新版firefox64.0,但最新版不兼容firebug,所以我必须下载旧版本的。在我旧版本下载完成后(这时候我的新版firefox是打开着的,而且处于自动更新状态),旧版本打开,仍然显示是最新版如何查看自己的firefox版本:https://jingyan.baidu.c......
  • Fdog系列(二):html写完注册页面之后怎么办,用java写后台响应呀。
    文章目录1.前言2.创建javaweb项目3.创建Server4.解决中文乱码问题5.响应后台数据目录Fdog系列(一):思来想去,不如写一个聊天软件,那就从仿QQ注册页面开始吧。所有文章源码已整体打包上传至github,求星星!1.前言接着第一篇用html完成了注册页面,第二篇,我们来完成后台数据处理,需要用......
  • 内存溢出OutOfMemoryError(OOM)
    除了程序计数器其它都会发生内存溢出:堆:堆内存耗尽,对象越来越多,又一直在使用,不能被垃圾回收。方法区:方法区内存耗尽,加载的类越来越多,在运行期间动态产生大量的类。栈:方法调用次数过多,无限创建大量的线程。......
  • 远程桌面凭据不工作请输入新凭据怎么办
    远程桌面提示凭据不工作当我们使用Windows远程桌面连接其他电脑时,有时会遇到远程桌面凭据不工作的问题,遇到这个问题我们该怎么解决呢?远程桌面凭据无法工作请输入新凭据,首先您得先检查您输入的密码是否正确,若密码错误则会出现远程桌面你的凭据不工作,确认密码无误后远程还是提示凭......
  • 远程桌面凭据不工作请输入新凭据怎么办
    远程桌面提示凭据不工作当我们使用Windows远程桌面连接其他电脑时,有时会遇到远程桌面凭据不工作的问题,遇到这个问题我们该怎么解决呢?远程桌面凭据无法工作请输入新凭据,首先您得先检查您输入的密码是否正确,若密码错误则会出现远程桌面你的凭据不工作,确认密码无误后远程还是提示凭......
  • 如果tomcat报错怎么办
      勾选服务器块中第二栏......
  • window 10 安装node.js时遇到2502 2503错误解决方法
    最近想安装一下node.js,可是在安装过程中出现了2503和2502的问题,如下图:不过除了这些代码外,微软并没有提供解决办法。这一问题出现在Win7/Win8.1/Win10中,原因就是C:\Windows\Temp文件夹NTFS权限错误。为了能够让WindowsInstaller操作正确,当前账户需要有Temp文件夹完全管理员权......
  • springcloud 第一个项目遇到的报错
    在创建模块springcloud-provider-8001的时候出现两个错误,一个是CLASSNOTFOUND,另一个是错误的类文件:/D:/apache-maven-3.8.8/maven-repo/org/springframework/spring-beans/6.0.4/spring-beans-6.0.4.jar!/org/springframework/beans/factory/annotation/Autowired.class   ......
  • 执行sh文件遇到的问题
    1、/bin/bash^M坏的解释器:没有那个文件或目录执行如下命令可解决:sed-i's/\r$//'your_script.sh......