首页 > 其他 > 详细

JVisualVM 模拟一次内存泄漏场景分析

时间:2019-05-15 20:03:06      阅读:91      评论:0      收藏:0      [点我收藏+]

首先贴一段内存泄漏的代码并且执行。(内存泄漏:GC回收不掉的实例对象)

package com.example.demo.memoryLeakDemo;

import com.example.demo.dto.ResponseDTO;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class memoryLeakTest {

    @Test
    public void test1(){
        Stack stack = new Stack();
        push(stack);
        pop(stack);

        while(true){

        }
    }

    private void push(Stack stack){
        ResponseDTO dto = null;

        for (int i = 0; i < 1000000; i++) {
            dto = new ResponseDTO();
            dto.setMesg("Memory Leak" + i);
            dto.setCode(i);
            stack.push(dto);
        }
    }

    private void pop(Stack stack){
        for (int i = 0; i < 1000000; i++) {
            System.out.println(stack.pop());
        }
    }
}

运行后,在jdk1.8找到jvisualvm.exe。

技术分享图片

1、建立连接:

技术分享图片

2、监视执行垃圾回收,没有显著变化。

技术分享图片

3、抽样中找出占用内存较大的类,尝试执行GC.发现ResponseDTO对象无显著变化

技术分享图片

4、dump,右击ResponseDTO,在实例视图中显示

 技术分享图片

5、发现引用的是Stack,

技术分享图片

6、检查Stack,发现结构此时Stack元素都在,检查代码,发现pop()后,ResponseDTO其实已经不用了,是可以回收的。

技术分享图片

7、修改代码:

 public Object pop() {
        if (size == 0)
            throw new EmptyStackException();

        elements[size] = null;
        return elements[--size];
    }

此时再看下内存监控:

技术分享图片

 

 

执行GC,发现实例已经回收

技术分享图片

 

JVisualVM 模拟一次内存泄漏场景分析

原文:https://www.cnblogs.com/xiaozhuanfeng/p/10871342.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!