美文网首页技术栈
2019-03-03——Java引用包 终结器

2019-03-03——Java引用包 终结器

作者: 烟雨乱平生 | 来源:发表于2019-03-03 23:55 被阅读0次

    在Object类里面有一个方法finalize()。

    protected void finalize() throws Throwable { }
    

    可以看到该方法是一个可以被继承和重写的方法。如果一个类重写了该方法,那么在类加载的时候JVM会调用Finalizer的register方法将其封装成一个Finalizer对象,并且最终封装到FinalReference对象里面。而FinalReference继承了Reference类。

    静态代码块

    static {
            ThreadGroup tg = Thread.currentThread().getThreadGroup();
            for (ThreadGroup tgn = tg;
                 tgn != null;
                 tg = tgn, tgn = tg.getParent());
            Thread finalizer = new FinalizerThread(tg);
            finalizer.setPriority(Thread.MAX_PRIORITY - 2);
            finalizer.setDaemon(true);
            finalizer.start();
        }
    

    FinalizerThread

    private static class FinalizerThread extends Thread {
            private volatile boolean running;
            FinalizerThread(ThreadGroup g) {
                super(g, "Finalizer");
            }
            public void run() {
                // in case of recursive call to run()
                if (running)
                    return;
    
                // Finalizer thread starts before System.initializeSystemClass
                // is called.  Wait until JavaLangAccess is available
                while (!VM.isBooted()) {
                    // delay until VM completes initialization
                    try {
                        VM.awaitBooted();
                    } catch (InterruptedException x) {
                        // ignore and continue
                    }
                }
                final JavaLangAccess jla = SharedSecrets.getJavaLangAccess();
                running = true;
                for (;;) {
                    try {
                        Finalizer f = (Finalizer)queue.remove();
                        f.runFinalizer(jla);
                    } catch (InterruptedException x) {
                        // ignore and continue
                    }
                }
            }
        }
    

    runFinalizer

    private void runFinalizer(JavaLangAccess jla) {
            synchronized (this) {
                if (hasBeenFinalized()) return;
                remove();
            }
            try {
                Object finalizee = this.get();
                if (finalizee != null && !(finalizee instanceof java.lang.Enum)) {
                    jla.invokeFinalize(finalizee);
    
                    /* Clear stack slot containing this variable, to decrease
                       the chances of false retention with a conservative GC */
                    finalizee = null;
                }
            } catch (Throwable x) { }
            super.clear();
        }
    

    相关文章

      网友评论

        本文标题:2019-03-03——Java引用包 终结器

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