jvm 内存泄露排查(visual vm)


jvm 内存泄露排查(visual vm)

内存泄露:对象使用结束,对象所占用的内存空间在垃圾收集的时候却不被回收

原因:对象被长生命周期的变量引用,如static变量

后果:如果大量的对象使用结束却无法回收,就用可能造成内存溢出(无法为新的对象分配内存)

 

***************************

示例

class MyObject{

    private int _1m=1024*1024;
    private byte[] b;

    public MyObject(){
        this.b=new byte[_1m];
    }
}

public class Test11 {

    private static List<MyObject> list=new ArrayList<>();

    public static void main(String[] args) throws Exception {
        for (int i=0;i<1000;i++){
            list.add(new MyObject());
            System.out.println("add "+i);

            try{
                Thread.sleep(1000);
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        System.out.println(list);
    }
}

说明:循环体内创建的对象添加进list中,list为全局变量,方法之行结束后对象也不会被释放,造成内存泄露

********************

控制台输出

虚拟机参数:-Xms500m -Xmx500m

。。。
add 240
add 241
add 242
add 243
add 244
add 245
add 246
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at runtime.MyObject.<init>(Test11.java:12)
	at runtime.Test11.main(Test11.java:22)

说明:循环体内创建的对象myObject无法释放,造成内存溢出

***************************

visual vm 内存泄露排查

visual gc标签

      

      

前后运行期间,老年代使用的空间逐渐增大,最终内存溢出,判断可能造成内存泄露

sampler:heap dump,之后一段时间再执行一次 heap dump

      

前后两次 heap dump比较

      

      

对比发现,MyObject对象明显增多

myObject ==》 open in new tab

       

myObject references

      

内存泄露对象在arrayList链表中

发布了387 篇原创文章 · 获赞 98 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43931625/article/details/105241467