zoukankan      html  css  js  c++  java
  • 【学习笔记】Java finalize()的使用

    《Java编程思想》中有提到,Java的垃圾回收器并不是那么靠谱,垃圾回收会占用很大的资源开销,垃圾回收器很懒,当变量和对象不再被引用、脱离作用域的时候,垃圾回收器会不定时的进行垃圾回收,也就是说,当内存资源紧张的时候,垃圾回收器才会以最快速度主动去回收资源释放内存,其他时候可能会回收也可能不会。

    如果当垃圾回收器工作的时候,会自动调用finalize(),查看Object类的源码会发现这个方法是个空方法(先不管底层),是不是说这个方法我们可以去重写呢?

    package com.github.hellxz.thinkinjava;
    
    public class TestFinalize {
    
        public static void main(String[] args) {
            /*
             * 创建FinalizeMethod类并调用
             */
            TestFinalize f = new TestFinalize();
            f.finalize();
            System.out.println("mian方法结束");
        }
        
        /*
         * 重写了Object类的方法
         */
        protected void finalize(){
            System.out.println("finalize方法执行了");
        }
    
    }
    //输出:

    //finalize方法执行了
    //mian方法结束

    
    

    看了上述代码,我们证实了Object类的这个方法的确是可以被重写的,在书中说finalize是在垃圾回收器删除对象之前调用的方法,那么修改上述代码进行测试

    package com.github.hellxz.thinkinjava;
    
    public class TestFinalize {
    
        public static void main(String[] args) {
            /*
             * 创建FinalizeMethod类并调用
             */
            TestFinalize f1 = new TestFinalize();
            TestFinalize f2 = new TestFinalize();
            TestFinalize f3 = new TestFinalize();
            TestFinalize f4 = new TestFinalize();
            
            System.out.println("mian方法结束");
        }
        
        /*
         * 重写了Object类的方法
         */
        protected void finalize(){
            System.out.println("finalize方法执行了");
        }
    
    }
    //输出:
    //mian方法结束

     虽然我们创建了这么多对象,而且都没有使用,但是重写的finalize方法并没有执行,这说明垃圾回收器并没有回收。Java中有System.gc()来强制垃圾回收器终结动作;为了使代码更有说服力,修改一下代码结构,使更直观

    package com.github.hellxz.thinkinjava;
    
    public class TestFinalize {
        public static void main(String[] args) {
            
            Apple a1 = new Apple(1);
            Apple a2 = new Apple(2);
            Apple a3 = new Apple(3);
            Apple a4 = new Apple(4);
            a1 = null; //置空a1
            a2 = null; //置空a2
            System.gc();
            System.out.println("mian方法结束");
        }
    }
    
    class Apple{
        
        private int i;
        public Apple(int i){
            this.i = i;
            System.out.println("apple "+ i +" is created!");
        }
        
        protected void finalize() throws Throwable {
            super.finalize(); //调用Object类方法
            System.out.println("apple "+ i +" is disposed!");
        }
    }
    //output:
    //apple 1 is created!
    //apple 2 is created!
    //apple 3 is created!
    //apple 4 is created!
    //mian方法结束
    //apple 1 is disposed!
    //apple 2 is disposed!

    结论:

    1、不要过分依赖finalize方法来执行资源清除工作,垃圾回收器会自动回收资源的

    2、finalize不同于c++的析构函数,无需主动释放内存,想调用可以使用System.gc();

    3、finalize用于清除非Java语言占用的内存,以及检查错误

    4、垃圾回收器不会一有垃圾就回收内存,除非内存吃紧

  • 相关阅读:
    Appium+python自动化3-启动淘宝app
    Appium+python自动化2-环境搭建(下)
    Appium+python自动化1-环境搭建(上)
    postman提取返回值
    Android studio(AS)的下载和安装
    monkey的安装和配置
    配置自己的CentOS7服务器
    mac-homebrew安装太慢
    vue.js中祖孙通信之provide与inject
    nginx location 以及 proxy_pass 的几种情况 以/结尾的问题
  • 原文地址:https://www.cnblogs.com/hellxz/p/7843864.html
Copyright © 2011-2022 走看看