内存泄漏之一 、线程造成的内在泄漏

2021-12-28  本文已影响0人  雨来

一个类 MachineBean

public class MachineBean {

        private static final int number = 990;
    private final int age = 504;

    /**
     * 我们学javaSe的时候 老师告诉我们 这个testMethod 属于 当前 MachineBean类的实例的
     */
    private void testMethod() {
//        age++; //报错 final修饰


        if(number==990){

        }

        System.out.println("abc");
        System.out.println(this);

    }

    public void invokeThread(){

        new Thread(new myThread()).start();
    }

    /**
     * 内部类持有外部类的实例导致的内存泄漏
     */
    class myThread implements Runnable {
        @Override
        public void run() {

            for (;;){
                try {
                    Thread.sleep(2000);
                    testMethod();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }

        }
    }
}

测试

public class Main {

    public static void main(String[] args) {
        // write your code here
        MachineBean machineBean = new MachineBean();
        machineBean.invokeThread();
        machineBean = null;
        //为什么置为null了还对象还可以被打印输出呢?
        System.gc();
    }
}

虽然 machineBean = null; 也调用了 System.gc(); 但 控制台会一直输出

abc
com.company.MachineBean@60de57fb

最主要的原因是非静态内部类持有了外部类的引用

上一篇 下一篇

猜你喜欢

热点阅读