JVM调优--05---内存泄漏、案例分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


内存泄漏 概念

何为内存泄漏 ?

在这里插入图片描述
在这里插入图片描述

只有对象不会再被程序用到了,但是GC又不能回收他们的情况,叫内存泄漏

内存泄漏与内存溢出的关系

在这里插入图片描述

内存泄漏的分类

在这里插入图片描述

java中----内存泄漏的8种情况

1. 静态集合类

在这里插入图片描述

2. 单例模式

在这里插入图片描述

3. 内部类持有外部类

在这里插入图片描述

4. 各种连接 ,如数据库连接,网络io连接等

在这里插入图片描述

5. 变量不合理的作用域

在这里插入图片描述

6. 改变的哈希值

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7. 缓存泄漏

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

/**
 * 演示内存泄漏
 *
 * @author shkstart
 * @create 14:53
 */
public class MapTest {
    static Map wMap = new WeakHashMap();
    static Map map = new HashMap();

    public static void main(String[] args) {
        init();
        testWeakHashMap();
        testHashMap();
    }

    public static void init() {
        String ref1 = new String("obejct1");
        String ref2 = new String("obejct2");
        String ref3 = new String("obejct3");
        String ref4 = new String("obejct4");
        wMap.put(ref1, "cacheObject1");
        wMap.put(ref2, "cacheObject2");
        map.put(ref3, "cacheObject3");
        map.put(ref4, "cacheObject4");
        System.out.println("String引用ref1,ref2,ref3,ref4 消失");

    }

    public static void testWeakHashMap() {

        System.out.println("WeakHashMap GC之前");
        for (Object o : wMap.entrySet()) {
            System.out.println(o);
        }
        try {
            System.gc();
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("WeakHashMap GC之后");
        for (Object o : wMap.entrySet()) {
            System.out.println(o);
        }
    }

    public static void testHashMap() {
        System.out.println("HashMap GC之前");
        for (Object o : map.entrySet()) {
            System.out.println(o);
        }
        try {
            System.gc();
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("HashMap GC之后");
        for (Object o : map.entrySet()) {
            System.out.println(o);
        }
    }

}

在这里插入图片描述
在这里插入图片描述

8. 监听器和回调

在这里插入图片描述

内存泄漏----案例分析

1. ThreadLocal

提升–10—ThreadLocal简介

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. 用数组实现栈

public class Stack {
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    public Stack() {
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(Object e) { //入栈
        ensureCapacity();
        elements[size++] = e;
    }

    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        return elements[--size]
    }

    private void ensureCapacity() {
        if (elements.length == size)
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }
}

分析问题 -----pop()

 public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        return elements[--size]
    }

在这里插入图片描述

修改

 public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null;
        return result;
    }

在这里插入图片描述
3.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值