当前位置: 首页 > news >正文

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

每天进步一丢丢,连接梦与想
如果你停止就是谷底,如果你还在努力就是上坡

系列文章
java"小心机"(1)【资源彩蛋!】
java小心机(2)| 重载和构造器的小细节

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

热门阅读:

**【推荐两款神器】不限速下载、追剧神器
**实用代码|javaMail发送邮件(文末重磅资源!)
限时领取| 热门编程语言学习资源,不收藏吗?
java面试系列文章:
java面试| 精选基础题(1)
java面试| 精选基础题(2)
java面试| 精选基础题(3)
阅读原文可查看更多精彩内容...**

end~thanks!

image

一个立志成大腿而每天努力奋斗的年轻人

伴学习伴成长,成长之路你并不孤单!

扫描二维码,关注公众号

                                             如果觉得文章不错,请点个赞、分享给你的朋友呗!

相关文章:

  • Adapter Class Cast Exception Removing Footer View from ListView
  • LeetCode--014--最长公共前缀
  • 串口超时处理原理及实现
  • ACM北大暑期课培训第一天
  • Delphi窗体创建释放过程及单元文件小结(转)
  • Linux部署zabbix3.4 结合钉钉智能报警
  • 学生分数排序
  • zabbix3.4上简单web监测功能测试
  • linux系统man查询命令等级与意义
  • 关于ES6的Promise的使用深入理解
  • P1065 津津的储蓄计划
  • 2018年 7月总结8月计划
  • Proteus仿真_01、 8086 IO译码仿真
  • CentOS 7之Postfix部署系列 (二) CentOS网络设置
  • AJAX PHP 请求实例
  • canvas 五子棋游戏
  • golang 发送GET和POST示例
  • gulp 教程
  • HTTP请求重发
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • node学习系列之简单文件上传
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PHP那些事儿
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • spring security oauth2 password授权模式
  • Vue全家桶实现一个Web App
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 分享几个不错的工具
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 让你的分享飞起来——极光推出社会化分享组件
  • 自定义函数
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 说说我为什么看好Spring Cloud Alibaba
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​Linux·i2c驱动架构​
  • $$$$GB2312-80区位编码表$$$$
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net 发送邮件
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net 提取注释生成API文档 帮助文档
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @private @protected @public
  • @RequestParam详解
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [20150707]外部表与rowid.txt
  • [C#] 如何调用Python脚本程序
  • [C/C++]数据结构 循环队列
  • [CISCN 2019华东南]Web11
  • [CSS] 点击事件触发的动画