内存泄漏的理解和分类

内存泄漏的理解:

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

内存泄漏的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);
        }
    }

}
/**
 * 结果
 * String引用ref1,ref2,ref3,ref4 消失
 * WeakHashMap GC之前
 * obejct2=cacheObject2
 * obejct1=cacheObject1
 * WeakHashMap GC之后
 * HashMap GC之前
 * obejct4=cacheObject4
 * obejct3=cacheObject3
 * Disconnected from the target VM, address: '127.0.0.1:51628', transport: 'socket'
 * HashMap GC之后
 * obejct4=cacheObject4
 * obejct3=cacheObject3
 **/

在这里插入图片描述

8、监听器和回调

猜你喜欢

转载自blog.csdn.net/u014496893/article/details/114918888