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!
一个立志成大腿而每天努力奋斗的年轻人
伴学习伴成长,成长之路你并不孤单!
如果觉得文章不错,请点个赞、分享给你的朋友呗!
java小心机(3)| 浅析finalize()的更多相关文章
- java小心机(5)| 浅谈类成员初始化顺序
类成员什么时候会被初始化呢?一般来说:"类的代码在初次使用时才被加载",加载过程包括了初始化. 比如说new A()调用构造函数时,类中全部成员都会被初始化. 但对于static域 ...
- java小心机(2)| 重载和构造器的小细节
每天进步一点点,距离大腿又近一步! 阅读本文大概需要10分钟 java小心机,为你诉说java鲜为人知的一面 涉及基本数据类型的重载 基本类型能从一个"较小"的类型自动提升到&qu ...
- java"小心机"(1)【资源彩蛋!】
每天进步一点点,距离大腿又近一步! 阅读本文大概需要9分钟 java"小心机"系列文章在此开篇.在这,将会给你带来曾经错过.忽略或感到模糊的知识,也许它很基础,微不足道,但它能修复 ...
- java小心机(4)| 继承与组合的爱恨情仇
在java中,有两种主要复用代码的方法:继承和组合. 继承,是OOP的一大特性,想必大家都非常熟悉了;组合,其实也很常见,只是不知道它的名字罢了. 继承 子类拥有父类的基本特性,需使用extend关键 ...
- java小心机(6)| 多态的一些坑
对于"多态"的概念,想必大家都很熟悉了,但我们还是来回顾一下吧 class Actor { public void act(){ System.out.println(" ...
- java正则表达式之java小爬虫
这个java小爬虫, 功能很简单,只有一个,抓取网上的邮箱.用到了javaI/O,正则表达式. public static void main(String[] args) throws IOExce ...
- Java小项目--坦克大战(version1.0)
Java小项目--坦克大战<TankWar1.0> 这个小项目主要是练习j2se的基础内容和面向对象的思想.项目实现了基本的简单功能,我方一辆坦克,用上下左右键控制移动方向,按F键为发射炮 ...
- 输出多行字符的一个简单JAVA小程序
public class JAVA { public static void main(String[] args) { System.out.println("-------------- ...
- (10.16)java小作业!
相信大家刚刚学习java多多少少都会写一些java的基础编程来练练手感,我也不例外!今天想和大家分享一下我最近所接触到的比较有趣的java小编程! 已知a已被赋值,b已被赋值,请编写java程序实现a ...
随机推荐
- 被孟加拉题吊打的ACM考试
https://codeforces.com/gym/101864 题目并不难 B 考虑新加入的线段和之前线段有交的个数 总数-不交的,不交的:右端点在[l,r]左边,左端点在[l,r]右边的. 维护 ...
- 【转】AUC(Area Under roc Curve )计算及其与ROC的关系
让我们从头说起,首先AUC是一种用来度量分类模型好坏的一个标准.这样的标准其实有很多,例如:大约10年前在machine learning文献中一统天下的标准:分类精度:在信息检索(IR)领域中常用的 ...
- 抓取IOS的apsd进程流量
IOS的apsd是Apple Push Service的相关进程,很多系统服务都跟他有关,比如iMessage.Homekit,因此想抓包查看他是怎么实现的. 1.搜索发现相关资料很少,只有多年前的一 ...
- Python6_模块、包、import、from import的解释
先说一下模块和包是什么? 模块(module):简单来说一个模块(module)就是一个py文件.在python中是这么约定. 模块里面有函数.类,就是一组代码的集合. 模块显然要有一个名字,这个 ...
- java agent技术原理及简单实现
注:本文定义-在函数执行前后增加对应的逻辑的操作统称为MOCK 1.引子 在某天与QA同学进行沟通时,发现QA同学有针对某个方法调用时,有让该方法停止一段时间的需求,我对这部分的功能实现非常好奇,因此 ...
- 专业版12.0试用,打开演示账套,提示“列名FPlatver无效”
你好,我代表研发来说明一下这个问题:一.产生的原因:由于KIS产品今年陆续都增加了应用平台,前期平台兼容性还有些问题,如果一台电脑有多个不同版本的平台,就会产生冲突,因此报错.1.可能您的机器装了多个 ...
- spring定时器时间设置规则
单纯针对时间的设置规则org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运行时间,只需要设置其cronExpressio ...
- 003 ansible部署ceph集群
介绍:在上一次的deploy部署ceph,虽然出了结果,最后的结果并没有满足最初的目的,现在尝试使用ansible部署一遍,看是否会有问题 一.环境准备 ceph1充当部署节点,ceph2,ceph3 ...
- tomcat+jdk安装部署
安装tomcat tar zxf jdk-8u66-linux-x64.tar.gz mkdir /application/java/ -p mv /home/oldboy/tools/jdk1.8. ...
- Windows远程桌面管理--功能强大的远程批量管理工具【转】
曾经,我想着要是有一款绿色小巧,功能实用的远程桌面管理工具,其界面简洁,操作便捷,能够同时远程操作多台服务器,并且多台服务器间可以自由切换,适用于网站管理人员使用的工具该有多好,苍天不负有心人,终于出 ...