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. Android之练习MVVM+DataBinding框架模式

    最近简单学习了MVVM框架,记录一下. 结果演示: 分析其功能在不同框架下的构成: 无框架 可以明显感受到在无框架下,虽然一个单独的Activity即可实现功能,但其负担过重,代码复查时繁琐,一旦需要 ...

  2. Python IDE ——Anaconda+PyCharm的安装与配置

    一 前言 最近莫名其妙地想学习一下Python,想着利用业余时间学习一下机器学习(或许仅仅是脑子一热吧).借着研究生期间对于PyCharm安装的印象,在自己的电脑上重新又安装了一遍.利用周末的一点时间 ...

  3. coding++:java—提取Html文本字符串中的内容

    package com.tree.ztree_demo; import java.util.regex.Matcher; import java.util.regex.Pattern; public ...

  4. BZOJ 4472 salesman 题解

    题目 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇之间都只有唯一的可能经过其它城镇的路线.小T可以准确地估计出在每个城镇停留的净收益.这些净收益可能是负数,即推销商品的 ...

  5. 如何在Linux下优雅的查询日志

    做为一名合格的Java后台开发 经常需要查询线上的日志,定位线上问题 所以熟练掌握日志查询的命令 可以使你更加迅速的定位错误日志位置,及时解决问题 在此,我将介绍几个自己工作中经常使用到的日志查询命令 ...

  6. Android 数据库框架 DBFlow 的使用

    原文首发于微信公众号:jzman-blog,欢迎关注交流! DBFlow 是一个基于注解处理器开发的使用方便的 ORM Android 数据库,该库简化了很多多余的代码,并且提供了好用的 API 来处 ...

  7. 关于js在一个固定的盒子里面拖拽的问题(包含临界值)

    回武汉打卡第三天,武汉加油,逆战必胜!今天我们一起分享一下js拖拽的问题. 当然实现拖拽方法是有很多的,下面简单讲一种方法,大致思路如下: 首先需要用到的事件主要有  onmousedown,onmo ...

  8. 使用Putty + Xming 远程登录Linux显示图形化界面

    一般我们远程登录linux 服务器,都是使用非加密的 telnet 或者加密的 ssh.这些登录方式有一个特点:只能登录字符界面,不能运行那些带有GUI界面的程序. 有时候为了学习或者工作的需要,我们 ...

  9. 1012 The Best Rank (25 分)

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  10. PTA数据结构与算法题目集(中文) 7-8

    PTA数据结构与算法题目集(中文)  7-8 7-8 哈利·波特的考试 (25 分)   哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是 ...