前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java小心机(3)| 浅析finalize()

java小心机(3)| 浅析finalize()

作者头像
KEN DO EVERTHING
发布2019-01-17 14:40:48
3610
发布2019-01-17 14:40:48
举报
文章被收录于专栏:KEN DO EVERTHING
  • 预备知识 JNI(Java Native Interface),它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)
  • 概念 finalize()是Object类中的一个方法,垃圾回收器准备释放对象占用的内存时,首先调用它的finalize()方法。
  • finalize()是否等同于C++中的析构函数? 答案是否定的。 析构函数:在C++中没有垃圾回收器,当对象需要被销毁时,需要手动调用delete()方法释放内存,而析构函数会在内存释放前被调用,用于释放对象使用的资源,比如在其中经常做一些文件保存之类的收尾工作。对象一定会被销毁。 finalize():会在垃圾回收器准备释放对象内存时被调用,但垃圾回收并不一定发生,只有在濒临内存溢出时才会被调用;若内存一直充足,则永远不会被调用。如果这个程序结束了,垃圾回收器一直没有释放掉你创建的任何对象的存储空间,则随着程序的退出,那些资源也会全部交还给操作系统。 finalize()并不会确保对象会被销毁,所以它不是析构函数。
  • 作用 1.释放那些不是通过new分配的内存 在JNI技术中,可能会通过C语言的malloc()分配内存,这部分内存无法通过垃圾回收器释放,只能通过在finalize()中调用本地方法释放。 2.用于检验终结条件(判断对象在清理时是否安全释放) 下面看个用于检验终结条件的例子:
代码语言:javascript
复制
public class Book {
    public boolean checkedOut = false;

    public Book(boolean checkedOut) {
        this.checkedOut = checkedOut;
    }

    public void checkIn() {
        checkedOut = false;
    }

    //重写finalize方法 \
    @Override
    protected void finalize() throws Throwable {
        //校验checkedOut
        if (checkedOut) {
            System.out.println("校验出现了一次错误: Checked out ");
        }
       super.finalize();
    }
}
代码语言:javascript
复制
public class TerminationCondition {
    public static void main(String[] args) {

        Book novel = new Book(true);
        novel.checkIn();

        //对checked进行了一次误操作,未进行签入
        new Book(true);

        //调用Gc 强制执行终结操作(finalize)
        System.gc();
    }
}

本例的终结条件是:所有的Book对象在被当作垃圾回收前都应该被签入(check in)。 在main()方法中可看到,一次误操作未对Book对象进行签入,导致有一本书没有被签入。此时我们可以使用finalize()验证终结条件。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档