java核心-JVM-gc面试题

1.写一个memory leak的例子

public class MemonyLeak {

    //1.memoryLeak内存泄漏
    /*
        这类错误报错具体显示:java.lang.OutOfMemoryError: java heap space
        导致原因,是gc无法回收不再使用的对象,这些无用的对象导致堆内存不足。
        通常有成员变量或全局变量导致,解决办法就是定义好变量的作用范围
     */

    Map<String, List<String>> a;

    public void printSomething(){

        ArrayList<String> content = new ArrayList<>();
        for(int i=0;i<10000000;i++){
            content.add(i+i+i+i+System.currentTimeMillis()+"");
        }
        a = new HashMap<>();
        a.put("aa", content);
        System.out.println(a.hashCode());
    }


    public static void  main(String[] args){
        MemonyLeak memonyLeak1 = new MemonyLeak();
        memonyLeak1.printSomething();
        MemonyLeak memonyLeak2 = new MemonyLeak();
        memonyLeak2.printSomething();
        MemonyLeak memonyLeak3 = new MemonyLeak();
        memonyLeak3.printSomething();
        MemonyLeak memonyLeak4 = new MemonyLeak();
        memonyLeak4.printSomething();
        MemonyLeak memonyLeak5 = new MemonyLeak();
        memonyLeak5.printSomething();
        MemonyLeak memonyLeak6 = new MemonyLeak();
        memonyLeak6.printSomething();
    }
}

执行了好半天,结果报错了

解决办法:

将成员变量写到方法printSomething()里面
    public void printSomething(){
        Map<String, List<String>> a;
        ArrayList<String> content = new ArrayList<>();
        for(int i=0;i<10000000;i++){
            content.add(i+i+i+i+System.currentTimeMillis()+"");
        }
        a = new HashMap<>();
        a.put("aa", content);
        System.out.println(a.hashCode());
    }

执行结果

可见对于内存泄漏的问题可能来源了对象的作用域定义不合理,成员变量或全局变量的对象作用域比较宽,gc来不及回收容易造成内存泄漏

猜你喜欢

转载自www.cnblogs.com/leeethan/p/10961324.html