每天进步一丢丢,连接梦与想

如果你停止就是谷底,如果你还在努力就是上坡

系列文章

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()的更多相关文章

  1. java小心机(5)| 浅谈类成员初始化顺序

    类成员什么时候会被初始化呢?一般来说:"类的代码在初次使用时才被加载",加载过程包括了初始化. 比如说new A()调用构造函数时,类中全部成员都会被初始化. 但对于static域 ...

  2. java小心机(2)| 重载和构造器的小细节

    每天进步一点点,距离大腿又近一步! 阅读本文大概需要10分钟 java小心机,为你诉说java鲜为人知的一面 涉及基本数据类型的重载 基本类型能从一个"较小"的类型自动提升到&qu ...

  3. java"小心机"(1)【资源彩蛋!】

    每天进步一点点,距离大腿又近一步! 阅读本文大概需要9分钟 java"小心机"系列文章在此开篇.在这,将会给你带来曾经错过.忽略或感到模糊的知识,也许它很基础,微不足道,但它能修复 ...

  4. java小心机(4)| 继承与组合的爱恨情仇

    在java中,有两种主要复用代码的方法:继承和组合. 继承,是OOP的一大特性,想必大家都非常熟悉了;组合,其实也很常见,只是不知道它的名字罢了. 继承 子类拥有父类的基本特性,需使用extend关键 ...

  5. java小心机(6)| 多态的一些坑

    对于"多态"的概念,想必大家都很熟悉了,但我们还是来回顾一下吧 class Actor { public void act(){ System.out.println(" ...

  6. java正则表达式之java小爬虫

    这个java小爬虫, 功能很简单,只有一个,抓取网上的邮箱.用到了javaI/O,正则表达式. public static void main(String[] args) throws IOExce ...

  7. Java小项目--坦克大战(version1.0)

    Java小项目--坦克大战<TankWar1.0> 这个小项目主要是练习j2se的基础内容和面向对象的思想.项目实现了基本的简单功能,我方一辆坦克,用上下左右键控制移动方向,按F键为发射炮 ...

  8. 输出多行字符的一个简单JAVA小程序

    public class JAVA { public static void main(String[] args) { System.out.println("-------------- ...

  9. (10.16)java小作业!

    相信大家刚刚学习java多多少少都会写一些java的基础编程来练练手感,我也不例外!今天想和大家分享一下我最近所接触到的比较有趣的java小编程! 已知a已被赋值,b已被赋值,请编写java程序实现a ...

随机推荐

  1. Mockito -- 入门篇

    Mockito是一种mock工具/框架.我理解EasyMock有点过时了,Mockito是现在比较流行的. 什么是mock?说的直白一点,大家都知道unit test应该是尽可能独立的.对一个clas ...

  2. 【52.55%】【BZOJ 4520】K远点对

    Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 588  Solved: 309 [Submit][Status][Discuss] Descript ...

  3. 【37.48%】【hdu 2587】How far away ?(3篇文章,3种做法,LCA之Tarjan算法)

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  4. git常用常用操作指令

    GIT操作 1:git init 初始化空的仓库,会在当前文件夹生成一个隐藏.git的文件夹,相当于一个仓库. 2:提交代码的流程:工作代码区-->暂存区 -->主仓库 -->服务器 ...

  5. Squid使用账号密码进行认证

    Squid 3.5支持ssl代理,为保证安全和滥用,可以使用简单的认证. Step1:在squid的配置文件中,添加如下: auth_param basic program /usr/lib64/sq ...

  6. monaco-editor使用

    monaco-editor是一款非常好用的web代码编辑器,那么如何把他加到自己的项目中呢. 1.下载插件 npm install monaco-editor@0.8.3 2.初始化编辑器值 < ...

  7. linux中的文件类型标记方法

    在ls -l显示的详细信息中有以下信息: -rw-r--r-- drwxr-xr-x 一共10个字符,第一个字符表示文件类型,后面9个字符分成3组表示文件权限.前三个表示属主(拥有者)对文件的权限,中 ...

  8. tomcat日志传参乱码问题

    问题:      在centos系统下,tomcat8.0.36控制台日志打印会出现中文乱码. 解决方案:      在catalina.sh里加上 JAVA_OPTS="-Dfile.en ...

  9. ECShop二次开发指南(一)

    ECSHOP是一套完整的网络商店解决方案,包括前台的商品展示.购物流程和强大易用的后台管理.由于 ecshop简单易用,使用者几乎可以在3几分钟简单的设置一下就可以拥有一个网上商店系统,所以很多的B2 ...

  10. smarty -- foreach用法详解

    {foreach},{foreachelse} 用于像访问序数数组一样访问关联数组 {foreach},{foreachelse} {foreach} is used to loop over an  ...