java堆分析——工具与实践

JAVA 2015-12-12

这篇文章承接上一篇继续对堆进行分析

我们首先来了解一下Memory Analyzer(MAT),它是基于Eclipse的软件,显然用于内存分析,附下载地址 链接 ,我用的版本是是1.5.0 打开后点击 file->Acquire Heap Dump 选择要分析的堆内存后可以多种方式查看

显示堆总体信息,比如消耗最大的一些对象等

1.png

柱状图显示,显示每个类的使用情况,比如类的数量,所占空间等

2.png

显示支配树

3.png

4.png

显示线程信息 5.png

6.png

7.png

那么什么是深堆和浅堆? 浅堆

  • 对象大小按照8字节对齐
  • 浅堆大小和对象的内容无关,只和对象的结构有关

    深堆

  • 一个对象被GC回收后,可以真实释放的内存大小
  • 只能通过对象访问到的(直接或者间接)所有对象的浅堆之和 (支配树)

    我们来看一个程序:

    public class Test {

    public static class Point{
        private int x;
        private int y;
        public Point(int x,int y){
            super();
            this.x=x;
            this.y=y;
        }
    }
    
    public static class Line{
        private Point startPoint;
        private Point endPoint;
        public Line(Point startPoint,Point endPoint){
            super();
            this.startPoint=startPoint;
            this.endPoint=endPoint;
        }
    }
    
    public static void main(String args[])throws InterruptedException{
        Point a=new Point(0,0);
        Point b=new Point(1,1);
        Point c=new Point(5,3);
        Point d=new Point(9,8);
        Point e=new Point(6,7);
        Point f=new Point(3,9);
        Point g=new Point(4,8);
        Line aLine=new Line(a,b);
        Line bLine=new Line(a,c);
        Line cLine=new Line(d,e);
        Line dLine=new Line(f,g);
        a=null;
        b=null;
        c=null;
        d=null;
        e=null;
        Thread.sleep(1000000);
    }

    }

分析: 8.png

9.png

可以看到,所有的Point实例浅堆和深堆的大小都是16字节。而dLine对象,浅堆为16字节,深堆也是16字节,这是因为dLine对象内的两个点f和g没有被设置为null,因此,即使dLine被回收,f和g也不会被释放。对象cLine内的引用对象d和e由于仅在cLine内还存在引用,因此只要cLine被释放,d和e必然也作为垃圾被回收,即d和e在cLine的保留集内,因此cLine的深堆为16*2+16=48字节。 对于aLine和bLine对象,由于两者均持有对方的一个点,因此,当aLine被回收时,公共点a在bLine中依然有引用存在,故不会被回收,点a不在aLine对象的保留集中,因此aLine的深堆大小为16+16=32字节。对象bLine与aLine完全一致。 MAT的功能不止这些,有待进一步探索。

继续介绍Visual VM的使用 Visual VM是java自带的多功能分析工具,可以用来分析堆Dump,位于jdk的bin目录下 10.png 还是分析上面的程序 点击 堆Dump按钮,可以查看类和对应的实例等信息 对类进查看: 11.png

对相应的类右击,选择 在实例类图中显示 12.png

也可以用 OQL控制台 来查询。


本文由 Tony 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!