OOM是什么

OOM全称"OutOfMemory",既内存溢出。我们知道,Java中的对象是在堆(heap)上创建的,当堆内存不足以为新创建的对象分配空间时,就会产生OutOfMemoryError。

为什么会产生OOM

由于GC机制的存在,Java程序员不需要过多地关注内存的分配与回收,GC通过“可达性分析”来判断一个对象是否需要被回收。

可达性分析:GC首先确定一组GC Root节点(通常是一些全局性的元素,例如JVM持有的对象),然后根据GC Root是否持有指向某个对象的引用或引用链来判断这个对象是否“可达”。

GC会回收大部分的无用对象,当发生OOM时,通常会有两种情况:

  1. JVM的堆内存真的不足了
  2. 代码问题

如果是堆内存不足,只需要简单地扩大堆内存就可以了。但是绝大多数情况下,OOM都是由代码问题引发的,也就是说很多本该被回收的对象没有被回收,导致堆内存不足。

如何处理OOM问题

  1. 处理OOM问题的关键在于拿到Heap Dump(堆转储文件),它保存了某一时刻JVM堆中对象对内存的使用情况。获取Heap Dump文件可以通过:

    • 启动程序前,添加JVM参数
    -XX:+HeapDumpOnOutOfMemoryError

    该参数的含义是:当发生OOM时,生成Heap Dump文件。

    • 程序运行过程中, 通过jmap获取。首先通过jps获取到Java进程的pid,然后通过jmap输出Dump文件
    jmap -dump:live,format=b,file=<filepath> <pid>

    其中filepath是生成dump文件的位置,pid是你想要分析的Java进程的pid。

  2. 拿到dump文件后,就可以通过一些图形化工具来进行分析了。常用的图形化工具有visual VM、MAT、JProfiler等。

举个栗子

  1. 首先我们编写一个程序,并设置JVM最大堆内存为128M,使其在一段时间后发生OOM,并使用vitual VM进行简单的分析。
-Xmx128m
import java.util.ArrayList;
import java.util.List; public class OOMExample {
public static void main(String[] args) throws InterruptedException {
List<byte[]> list = new ArrayList<>();
for(int i=0;i<128;i++){
list.add(new byte[1024*1024]);
Thread.sleep(500);
}
}
}
  1. 运行期间我们通过在命令行中输入jps可以获取到当前进程pid。也可以通过vitual VM直接查看(我这里是分开两次运行截的图所以pid不一致)。

  1. 通过vitual VM我们可以看到程序的实时运行情况,正常情况下程序的内存曲线应该是波浪形,我们的程序即将发生OOM。

  1. 通过jmap获取dump文件
jmap -dump:live,format=b,file="/12844.hprof" 12844
  1. 使用vitual VM查看dump文件

很明显可以看到byte数组占据了绝大部分的内存,这与我们的预想一致。实际场景中,OOM的对象引用关系要比这复杂得多,具体问题具体分析,如何快速发现问题代码,也是一个难题,本文权当抛砖引玉。

Java中的OOM问题的更多相关文章

  1. Java中关于OOM的场景及解决方法

    原文地址:http://developer.51cto.com/art/201112/305696.htm 1.OOM for Heap=>例如:java.lang.OutOfMemoryErr ...

  2. Java中关于OOM的场景及解决方法(转)

    http://developer.51cto.com/art/201112/305696.htm 1.OOM for Heap=>例如:java.lang.OutOfMemoryError: J ...

  3. [转载] java中关于OOM的场景及解决方法

    1.OOM for Heap=>例如:java.lang.OutOfMemoryError: Java heapspace[分析] 此OOM是由于JVM中heap的最大值不满足需要,将设置hea ...

  4. java中OOM错误解析(面试可以聊的东西)

    嗯,生活加油鸭.... 实习中遇到OOM错误 GC overhead limit exceeded 问题,所以整理一下OOM异常问题: 先看一下“阿里的开发手册”对OOM的描述: OOM,全称“Out ...

  5. Java中四种引用:强、软、弱、虚引用

    这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...

  6. Java中的字符串常量池

    ava中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...

  7. 理论篇-Java中一些零碎的知识点

    1. Java中length,length方法,size方法区别 length属性:用于获取数组长度. length方法:用于获取字符串长度. size方法:用于获取泛型集合有多少个元素. 2. is ...

  8. java中引用的概念

    强引用(StrongReference) 强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用: 1 2 Object object = new Object(); ...

  9. JAVA中的引用

    关于值类型和引用类型的话题,C++.JAVA.python.go.C#等等高级语言都有相关的概念,只要理解了其底层工作原理,可以说即使是不同的语言,在面试学习工作实践中都可以信手拈来(不要太纠集语言) ...

随机推荐

  1. 【分布式锁】07-Zookeeper实现分布式锁:Semaphore、读写锁实现原理

    前言 前面已经讲解了Zookeeper可重入锁的实现原理,自己对分布式锁也有了更深的认知. 我在公众号中发了一个疑问,相比于Redis来说,Zookeeper的实现方式要更好一些,即便Redis作者实 ...

  2. pat 1044.火星数字 Java版

    个人网站:https://www.lingluan.xyz 火星人是以13进制计数的: 地球人的0被火星人称为tret. 地球人数字1到12的火星文分别为:jan, feb, mar, apr, ma ...

  3. 粒子群优化算法(PSO)之基于离散化的特征选择(FS)(二)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 作者:Geppetto 前面我们介绍了特征选择(Feature S ...

  4. NeurIPS审稿引发吐槽大会,落选者把荒唐意见怼了个遍:“我谢谢你们了”

    七月份的尾巴,机器学习顶会NeurIPS 2019的初步结果已经来了. 一年一度的吐槽盛会也由此开始. "有评审问我啥是ResNet." "有评审问我为啥没引用X论文.我 ...

  5. 十分钟一起学会ResNet残差网络

    作者 | 荔枝boy 目录 深层次网络训练瓶颈:梯度消失,网络退化 ResNet简介 ResNet解决深度网络瓶颈的魔力 ResNet使用的小技巧 总结 深层次网络训练瓶颈:梯度消失,网络退化 深度卷 ...

  6. ios 13 陀螺仪DeviceOrientationEvent需要申请用户权限

    有些代码跑着跑着就报错了,有些陀螺仪用着用着就不能用了. 目前时间是2020.4.4,发现  ios 13系统调用陀螺仪 需要申请用户权限(这应该是个趋势,后面安卓应该陆续跟进).具体实现来看下: 1 ...

  7. Codeforces #614 div.2 (A-E)

    A  ConneR and the A.R.C. Markland-N #include <bits/stdc++.h> using namespace std; #define ll l ...

  8. 基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (番外篇)

    前言 回顾之前的两篇Swagger做Api接口文档,我们大体上学会了如何在net core3.1的项目基础上,搭建一套自动生产API接口说明文档的框架. 本来在Swagger的基础上,前后端开发人员在 ...

  9. Day17---轻量级、高性能的服务器--Nginx

    Nginx基础 一.nginx的介绍 简介:Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMPA/POP3/SMTR代理服务器. 二.编译安装nginx 1.首先要安装PRCE(PRCE ...

  10. session分布式处理

    session分布式处理 标签(空格分隔): 分布式 1. Session复制 在支持Session复制的Web服务器上, 通过修改服务器配置, 可以实现将Session同步到其它Web服务器上, 达 ...