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

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

作者: 雨来 | 来源:发表于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