• 性能案例分析 | MAT分析内存泄露


    作者:21004129     原文转自:https://www.cnblogs.com/walson/p/3913055.html


    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可以通过相同的方式计算。

    找出内存泄露代码

  • 相关阅读:
    python-文件操作
    python之-字符编码
    课程总结
    IO流文件输出流的应用
    字符串的基本操作
    数据结构字符串实训报告
    窗口的切换
    事件处理
    Java异常处理
    二维数组实现转置
  • 原文地址:https://www.cnblogs.com/wyf0518/p/12214338.html
Copyright © 2020-2023  润新知