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());
}
}
}
php
说明:java
说明:回收前Heap堆占用大小-->回收后占用大小(堆空间大小)最后是耗时多久(秒)数组
首先,打开eclipse->Help->Install new software->work with右边的Add...eclipse
弹出的对话框以下spa
在Name框中输入名称,location中输入以下地址:插件
http://download.eclipse.org/mat/1.2/update-site/
对象
这个地址安装的版本是1.2.1。ip
具体版本下载地址为http://www.eclipse.org/mat/downloads.php。内存
点击肯定就好。get
肯定了以后,出现了选择安装的界面。选择所有便可。进行下一步一路next下去便可。
从饼图能够看出整个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 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是obj一、obj二、obj4的shallow size总和;右图的retained size是obj一、obj二、obj三、obj4的shallow size总和。obj2的retained size能够经过相同的方式计算。