一、什么是内存溢出?

内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。

在Java中,将会产生java.lang.OutOfMemoryError。看下关于的官方说明: Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector. 意思就是说,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error(注:非exception,因为这个问题已经严重到不足以被应用处理)。

二、为什么产生OOM?

为什么会没有内存了呢?原因不外乎有两点:

  • 分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
  • 应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。

在Java语言中,由于存在了垃圾自动回收机制,所以,我们一般不用去主动释放不用的对象所占的内存,也就是理论上来说,是不会存在“内存泄露”的。但是,如果编码不当,比如,将某个对象的引用放到了全局的Map中,虽然方法结束了,但是由于垃圾回收器会根据对象的引用情况来回收内存,导致该对象不能被及时的回收。如果该种情况出现次数多了,就会导致内存溢出,比如系统中经常使用的缓存机制。Java中的内存泄露,不同于C++中的忘了delete,往往是逻辑上的原因泄露。

三、如何分析Java OOM?

在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫javacore,或java dump)。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。这里我们重点介绍heap dump。 heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。

四、案例

首先,我们来开发一段Java程序。

import java.util.*;public class Test { public static void main(String[] args) {  List list = new ArrayList();    int i = 0;  while (true) {   list.add(new String("test"));  } }}

使用下面的命令运行该程序时设置JVM的堆内存(heap size)的极限值为10M(-Xmx10m)。

java -Xmx10m Test

很快,程序将会产生OOM的错误,如下图所示:

五、如何生成Head Dump文件?

我们可以在运行Java程序的时候,加入下面的参数:

-XX:+HeapDumpOnOutOfMemoryError

此参数是帮助生成dump文件,程序启动后直到抛出OOM异常。异常抛出后,在程序的classpath下会生成以一个以.hprof结尾的文件,如:java_pid4504.hprof,这就是我们需要的dump文件。

如下图所示:

六、使用IBM heapAnalyzer分析Head Dump文件

IBM heapAnalyzer(https://www.ibm.com/support/pages/ibm-heapanalyzer)是IBM开发的强大的内存dump分析工具,,IBM heapAnalyzer是通过分析OOM后的Java heap dump文件的,通过对dump文件的分析找到内存可能泄露的点。

启动IBM heapAnalyzer,并导入刚才生成的Heap Dump文件,如下图所示。

通过分析我们会发现,系统94.19%的内存都被一个ArrayList占用了(里面保存的都是Object)。这里就有可能是一个内存的溢出点。当然,我们这个例子非常典型,在实际工作可能没有这么明显,需要具体问题具体分析。

javacore分析工具_「赵强老师」如何分析Java的内存溢出问题相关推荐

  1. hprof文件分析工具_【赵强老师】如何分析Java的内存溢出问题

    欢迎关注赵强老师微信公众号:myitshare 一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你 ...

  2. go mongodb排序查询_「赵强老师」MongoDB中的索引(下)

    (四)索引的类型三:复合索引(Compound Index)** MongoDB支持复合索引,即将多个键组合到一起创建索引.该方式称为复合索引,或者也叫组合索引,该方式能够满足多键值匹配查询使用索引的 ...

  3. nodejs redis 发布订阅_「赵强老师」Redis的消息发布与订阅

    Redis 作为一个publish/subscribe server,起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型 ...

  4. dbf如何导入oracle_「赵强老师」第一个Oracle的手工管理的备份和恢复

    一.什么是手工管理的备份与恢复? 尽管在Oracle中,已经有了RMAN的备份与恢复.但是作为Oracle备份恢复的一种方式,我们将在本文中通过一个例子来为大家介绍如何使用手工的方式来完成Oracle ...

  5. oracle select 行数据_【赵强老师】什么是Oracle的数据字典?

    欢迎关注赵强老师微信公众号:myitshare 数据字典是oracle存放有关数据库信息的地方,几乎所有的系统信息和对象信息都可在数据字典中进行查询.数据字典是oracle数据库系统的信息核心,它是一 ...

  6. oracle 锁表如何查看_【赵强老师】第一个Oracle的手工备份和恢复

    欢迎关注赵强老师微信公众号:myitshare 一.什么是手工管理的备份与恢复? 尽管在Oracle中,已经有了RMAN的备份与恢复.但是作为Oracle备份恢复的一种方式,我们将在本文中通过一个例子 ...

  7. redis 发布订阅实际案例_【赵强老师】Redis的消息发布与订阅

    欢迎关注赵强老师微信公众号:myitshare Redis 作为一个publish/subscribe server,起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向 ...

  8. 开启mongodb数据库命令行_【赵强老师】使用MongoDB的命令行工具:mongoshell

    一.启动mongo shell 安装好MongoDB后,直接在命令行终端执行下面的命令: mongo 如下图所示: 可选参数如下: 也可以简写为: 在mongo shell中使用外部编辑器,如:vi, ...

  9. oracle 变量赋值_【赵强老师】Oracle存储过程中的out参数

    欢迎关注赵老师公众号,公众号搜索:myitshare 一.什么是存储过程 Oracle存储过程可以说是一个记录集吧,它是由一些PL/SQL语句组成的代码块,这些PL/SQL语句代码像一个方法一样实现一 ...

最新文章

  1. 从大数据技术参考模型角度梳理大数据标准
  2. .net core 获取客户端ip
  3. php 读写文件 file_put_contents() 与 file_get_contents() 函数用法
  4. Spring-Spring 开发环境搭建及HelloSpring
  5. mysql8强制用户开启ssl_MySQL8开启ssl加密
  6. 简单的计时器实现(JFrame)
  7. 能不做自己写个类,也叫java.lang.String
  8. python本地编译器_Python学习札记(0)——Python开发环境搭载及推荐几款Python编译器...
  9. 使用Regsvr32命令修复系统故障
  10. bzoj3527: [Zjoi2014]力 fft
  11. 京东宙斯平台使用方法(accesstoken,appkey,appsecret参数和SDK的获取)
  12. linux 自动开飞行模式,Android飞行模式灰显不能操作问题分解
  13. SwitchHosts 没有权限operation not permitted解决方案
  14. 斯蒂芬妮·梅尔 de《暮光之城》
  15. 数据分析师的工作职责是什么?
  16. 基于STM32单片机智能RFID刷卡汽车位锁设计(论文
  17. 靠着“反转”设计,这些短视频火了
  18. 【蓝桥杯选拔赛真题01】Scratch消失的小猫 少儿编程scratch蓝桥杯选拔赛真题讲解
  19. [Codeforces Round #516][Codeforces 1063C/1064E. Dwarves, Hats and Extrasensory Abilities]
  20. 参数随机场,随机参数生成python代码,基于乔列斯基分解中点法分解

热门文章

  1. Vivado开发过程中生成的主要文件
  2. 微软拼音输入法2007状态栏无法显示!
  3. python建立访客记录
  4. 四说大数据时代“神话”:从大数据到深数据\n
  5. 上接稳扎稳打Silverlight(20) - 2.0通信之WebClient, 以字符串的形式上传/下载数据
  6. Object-c:NSString的创建
  7. Linux iptables防火墙设置与NAT服务配置
  8. LINUX DNS服务的配置(一)
  9. 功能强大的打包工具 NSIS,全部用脚本搞定 使用经验总结帖(持续更新中。。。)...
  10. 解决老版本eclipse无法完全替换主题的问题