OutOfMemoryError示例

代码

package com.walson.heap;

import java.util.ArrayList;
import java.util.List;

/**
 * java 堆溢出
 *
 * -verbose:gc -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
 * @author gjh1
 *
 */
public class HeapOOM {

static class OOMObject{
        
    }
    
    public static void main(String[] args) {
        List<OOMObject> list = new ArrayList<HeapOOM.OOMObject>();
        
        while (true) {
            list.add(new OOMObject());
            
        }
    }

}

java虚拟机设置

说明:

  1. -Xms:最小堆内存
  2. -Xmx:最大堆内存
  3. 设置-Xms与-Xmx一样都为20M是为了避免堆内存知道扩展
  4. -XX:+HeapDumpOnOutOfMemoryError :虚拟机出现内存溢出异常时Dump出当前的内存堆转储快照以便事后分析。(项目文件夹下)

运行结果

[GC (Allocation Failure) 5504K->3237K(19840K), 0.0108051 secs]
[GC (Allocation Failure) 8741K->7223K(19840K), 0.0123580 secs]
[GC (Allocation Failure) 12727K->12727K(19840K), 0.0179589 secs]
[Full GC (Allocation Failure) 18231K->12016K(19840K), 0.0451467 secs]
[Full GC (Allocation Failure) 14714K->14711K(19840K), 0.0540938 secs]
[Full GC (Allocation Failure) 14711K->14691K(19840K), 0.0588749 secs]
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid4352.hprof ...
Heap dump file created [26506297 bytes in 0.267 secs]
 

说明:回收前Heap堆占用大小-->回收后占用大小(堆空间大小)最后是耗时多久(秒)

分析内存泄露

Memory Analyzer插件的安装

首先,打开eclipse->Help->Install new software->work with右边的Add...

弹出的对话框如下

在Name框中输入名称,location中输入如下地址:

http://download.eclipse.org/mat/1.2/update-site/

这个地址安装的版本是1.2.1。

具体版本下载地址为http://www.eclipse.org/mat/downloads.php

点击确定就好。

确定了之后,出现了选择安装的界面。选择全部即可。进行下一步一路next下去即可。

分析dump文件

打开堆内存转储文件

饼图分析

从饼图可以看出整个heap14.3M,深色区域占了13.9M,占94.71%,怀疑深色区域为内存泄露对象。下面描述The memory is accumulated in one instance of "java.lang.Object[]" loaded by "<system class loader>".大概是说深色区域的内存系统类加载器用来累积加载Object数组

详细分析

Dominator Tree为对象关系树形图

Shallow Heap与Retained Heap的计算

Shallow size就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。在32位系统上,对象头占用8字节,int占用4字节,不管成员变量(对象或数组)是否引用了其他对象(实例)或者赋值为null它始终占用4字节。故此,对于String对象实例来说,它有三个int成员(3*4=12字节)、一个char[]成员(1*4=4字节)以及一个对象头(8字节),总共3*4 +1*4+8=24字节。根据这一原则,对String a=”rosen jiang”来说,实例a的shallow size也是24字节。

Retained size是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。为了更好的理解retained size,不妨看个例子。

把内存中的对象看成下图中的节点,并且对象和对象之间互相引用。这里有一个特殊的节点GC Roots,正解!这就是reference chain的起点。

从obj1入手,上图中蓝色节点代表仅仅只有通过obj1才能直接或间接访问的对象。因为可以通过GC Roots访问,所以左图的obj3不是蓝色节点;而在右图却是蓝色,因为它已经被包含在retained集合内。

所以对于左图,obj1的retained size是obj1、obj2、obj4的shallow size总和;右图的retained size是obj1、obj2、obj3、obj4的shallow size总和。obj2的retained size可以通过相同的方式计算。

找出内存泄露代码

Eclipse Memory Analyzer 分析内存泄露的更多相关文章

  1. 使用Eclipse Memory Analyzer分析内存

    1 内存泄漏的排查方法 Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分,当中有两项功能可用于内存检查 : ·    heap 查看堆的分配情况 ·     ...

  2. 用Eclipse Memory Analyzer查找内存泄露

    写在CSDN里面了 http://blog.csdn.net/dayulxl/article/details/78164301

  3. [转]一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出 前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序 ...

  4. 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    转:http://tivan.iteye.com/blog/1487855 前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严 ...

  5. 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出(转)

    前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题.我们需要找造成OutOfMemoryError原因.一般有两种情况 ...

  6. 使用Eclipse Memory Analyzer分析Tomcat内存溢出

    前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题.我们需要找造成OutOfMemoryError原因.一般有两种情况 ...

  7. Eclipse Memory Analyzer,内存泄漏插件,安装使用一条龙

    网上文档很多,但最初都有问题.整理一份,作为备份.使用过程:开发代码写完后,对可能出现内存溢出的代码,添加配置文件,生成.hprof文件,用memory Analyzer分析排查问题,且泄漏内存大小可 ...

  8. 使用AndroidStudio dump heap,再用 Eclipse MAT插件分析内存泄露

    1.eclipse mat插件的安装 Help->Install new software,如下图,一直下一步即可 2.AndroidStudio dump heap 3.AndroidStud ...

  9. 使用Eclipse Memory Analyzer进行内存泄漏分析

    一.准备工作 1)工具下载: http://www.eclipse.org/mat/downloads.php 可以选择eclipse插件的方式安装 http://download.eclipse.o ...

随机推荐

  1. 使用 ado.net访问数据库

    一.ADO.NET :用于连接数据库的技术   1.ADO.NET分为两大组件    DataSet:数据集    .NET FRAMWORK :用于连接到数据库,发送命令,检索结果   2.ADO. ...

  2. vue路由的懒加载

    一.懒加载 也叫延迟加载或者按需加载,即在需要的时候进行加载,   二.为什么要使用懒加载 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要 ...

  3. bottle.py中的SimpleTemplate

    import re class SimpleTemplate(object): re_block = re.compile(r'^\s*%\s*((if|elif|else|try|except|fi ...

  4. jdk环境变量配置改变不生效的问题

    在工作中两次遇到jdk配置上的这个问题:将环境变量中的jdk路径修改之后,使用-version查看,版本号还是之前的,也就是说修改未生效.甚至当我将Path变量中的jdk路径配置都删除了之后,使用-v ...

  5. random模块用法

    最近生病,学习进度少许拖延,, import random # 随机取0~1之间的小数 print(random.random()) # 随机取2数之间的整数 print(random.randint ...

  6. python—文件创建

    # 1.文件操作# day1.txt# 1.文件路径:E:\day1.txt# 2.编码方式:utf-8.gbk# 3.操作方式:只读,只写,追加,读写,写读# 以什么编码方式储存的方式储存就以什么编 ...

  7. Docker 部署应用过程记录

    Kibana直接部署到centos中,老是没有任何征兆退出,今天将他移动到docker中部署,以下是部署的过程,做个记录防止忘记 1.安装Docker # yum install docker 2.启 ...

  8. Jenkins强制语言设置

    最近对照各种Jenkins的教程,发现在jenkins的页面中经常会中英文混合,每个人根据各自系统的不同也会出现语言不同,虽然可以翻译过来,但是中英文的混合差异还是蛮大的,造成项目间沟通障碍. 所以, ...

  9. Netty 中 EventLoopGroup 的创建

    本文是基于 Netty 4.1.6.Final 的源码来分析的. 在分析源码之前做一些准备工作: 先熟悉一下 IDEA 的几个快捷键,能极大的提高我们查看源码的效率: Ctrl + Alt + B:用 ...

  10. Matlab 提取R,G,B颜色分量

    >> im = imread('ny.png'); >> r = im(:,:,1); >> g = im(:,:,2); >> b = im(:,:, ...