美文网首页
内存泄漏之一 、线程造成的内在泄漏

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

作者: 雨来 | 来源:发表于2021-12-28 17:14 被阅读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

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

相关文章

网友评论

      本文标题:内存泄漏之一 、线程造成的内在泄漏

      本文链接:https://www.haomeiwen.com/subject/nfgpqrtx.html