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

Posted 高高for 循环

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.

以上是关于JVM调优--05---内存泄漏案例分析的主要内容,如果未能解决你的问题,请参考以下文章

JVM常用性能分析工具

jvm调优篇 > CPU占用率高内存泄漏内存溢出查错教程

IOS性能调优系列:使用Instruments动态分析内存泄漏

IOS性能调优系列:使用Instruments动态分析内存泄漏

jvm调优-从eclipse开始

jvm调优-从eclipse开始