如果很好说出finalize用法,面试官会认为你很资深
我在面试Java候选人的时候,有时候会通过finalize问及候选人在JVM方面的技能,一般的问法是:你知不知道finalize方法,在项目里有没有重写过这个方法?在本文里就将详细来说下这个知识点。
finalize()是Object类里的protected类型的方法,子类(所有类都是Object的子类)可以通过覆盖这个方法来实现回收前的资源清理工作。和这个方法相关的流程如下所述。
1 Java虚拟机一旦通过刚才提到的“根搜索算法”判断出某对象处于可回收状态时,会判断该对象是否重写了Object类的finalize方法,如果没,则直接回收。
2 如重写过finalize方法,而且未执行过该方法,则把该对象其放入F-Queue队列,另个线程会定时遍历F-Queue队列,并执行该队列中各对象的finalize方法。
3 finalize方法执行完毕后,GC会再次判断该对象是否可被回收,如果可以,则进行回收,如果此时该对象上有强引用,则该对象“复活”,即处于“不可回收状态”。
通过下面的FinalizeDemo.java,我们来演示下通过finalize方法复活对象的做法。
1 public class FinalizeDemo {
2 static FinalizeDemo obj = null;
3 //重写Object里的finalize方法
4 protected void finalize() throws Throwable {
5 System.out.println("In finalize()");
6 obj = this; //给obj加个强引用
7 }
8 public static void main(String[] args) throws InterruptedException {
9 obj = new FinalizeDemo();
10 obj = null; //去掉强引用
11 System.gc(); //垃圾回收
12 //sleep 1秒,以便垃圾回收线程清理obj对象
13 Thread.sleep(1000);
14 if (null != obj) { //在finalize方法复活
15 System.out.println("Still alive.");
16 } else {
17 System.out.println("Not alive.");
18 }
19 }
20 }
在main函数里的第9行里,我们给第2行定义的obj对象分配了一块内存空间,并在第10行去掉obj所指空间的强引用,在第11行,通过System.gc方法启动了垃圾回收机制。
这时,由于obj所指向的对象上没有强引用,所以这块对象可以被回收,在回收前,是会执行其中的finalize方法。
在第4行重写的finalize方法里,我们给obj对象加了一个强引用,这样的话,在finalize方法被执行后,obj对象就不符合被回收的条件了,所以在第14行的if…else判断里,走第15行的流程,输出“still alive.”这句话。
不过,由于垃圾回收和遍历F-Queue队列不是同一个线程,所以一旦重写了这个方法,就有可能导致对象被延迟回收,如果这个方法再被放入错误的代码,就极有可能导致该对象无法回收。
所以回到本文开始的两个问题。
第一,finalize方法干嘛的?
在其中可以编写对象被回收时的动作,具体的流程大家可以按本文给出的意思说一遍。
第二,你有没有重写过这个方法?
由于重写finalize不当,会导致该对象无法回收,所以在项目里,我们一般不重写该方法,而会采用Object类自带的空的finalize方法。
请大家关注我的公众号:一起进步,一起挣钱,在本公众号里,会有很多精彩的面试文章。
如果很好说出finalize用法,面试官会认为你很资深的更多相关文章
- 看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了
我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 已提交此篇文章 final 是 Java 中的关键字 ...
- 【面试】吃透了这些Redis知识点,面试官一定觉得你很NB(干货 | 建议珍藏)
万字长文,干货满满. 是数据结构而非类型 很多文章都会说,redis支持5种常用的数据类型,这其实是存在很大的歧义.redis里存的都是二进制数据,其实就是字节数组(byte[]),这些字节数据是没有 ...
- 学会了这些redis知识点,面试官会觉得你很nb(转自十年技术大牛)
是数据结构而非类型 很多文章都会说,redis支持5种常用的数据类型,这其实是存在很大的歧义.redis里存的都是二进制数据,其实就是字节数组(byte[]),这些字节数据是没有数据类型的,只有把它们 ...
- 你都这么拼了,面试官TM怎么还是无动于衷
面试,对于每个人而然并不陌生,可以说是必须经历的一个过程了,小到一场考试,大到企业面试,甚至大型选秀...... 有时自己明明很努力了,但偏偏会在面试环节出了插曲,比如,紧张就是最容易出现的了. 我相 ...
- 你都这么拼了,面试官TM怎么还是无动于衷?
前言 面试,对于每个人而然并不陌生,可以说是必须经历的一个过程了,小到一场考试,大到企业面试,甚至大型选秀...... 有时自己明明很努力了,但偏偏会在面试环节出了插曲,比如,紧张就是最容易出现的了. ...
- 面试官:你对Redis缓存了解吗?面对这11道面试题你是否有很多问号?
前言 关于Redis的知识,总结了一个脑图分享给大家 1.在项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试官心理分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚, ...
- 【MySQL】面试官问我:MySQL如何实现无数据插入,有数据更新?我是这样回答的!
写在前面 马上就是金九银十的跳槽黄金期了,很多读者都开始出去面试了.这不,又一名读者出去面试被面试官问了一个MySQL的问题:向MySQL中插入数据,如何实现MySQL中没有当前id标识的数据时插入数 ...
- 【MySQL】我这样分析MySQL中的事务,面试官对我刮目相看!!
写在前面 相信大部分小伙伴在面试过程中,只会针对面试官提出的表面问题来进行回答.其实不然,面试官问的每一个问题都是经过深思熟虑的,面试的时间相对来说也是短暂的,面试官不可能在很短的时间内就对你非常了解 ...
- 面试官问我:Object o = new Object() 占用了多少个字节?
小小面试一下 前言蜜语 最近马师傅火的不要不要的,虽然没有抢到耗子尾汁的商标注册权,但是必须得蹭一波马师傅的热度,下面就是闪电五连鞭的教学环节,你准备好了吗! 在正式内容开始前先甩两篇关于类加载机制和 ...
- 面试官:Redis的共享对象池了解吗?
我正在面试间里焦急地等待着,突然听到了门外的脚步声,随即门被打开,穿着干净满脸清秀的青年走了进来,一股男士香水的淡香扑面而来. 面试官:"平时在工作中用过Redis吗?" 我:&q ...
随机推荐
- Java八股面试整理(4)
34.遇到过异常吗,如何处理? 在Java中,可以按照如下三个步骤处理异常: 捕获异常 将业务代码包裹在try块内部,当业务代码中发生任何异常时,系统都会为此异常创建一个异常对象.创建异常对象之后,J ...
- 自定义一个简单的SpringBoot-Starter
1.创建一个简单的maven项目 2.导入相关依赖 <dependencies> <!--核心场景启动器,包含Spring的核心功能--> <dependency> ...
- 【scikit-learn基础】--『预处理』之 正则化
数据的预处理是数据分析,或者机器学习训练前的重要步骤.通过数据预处理,可以 提高数据质量,处理数据的缺失值.异常值和重复值等问题,增加数据的准确性和可靠性 整合不同数据,数据的来源和结构可能多种多样, ...
- Educational Codeforces Round 26 Problem B
B. Flag of Berland time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- 数字孪生为何需要融合GIS?以智慧城市项目为例说明
数字孪生和地理信息系统(GIS)是两个在现代科技中崭露头角的概念,它们的融合为智慧城市项目带来了革命性的机会.本文将解释数字孪生为何需要融合GIS,并以智慧城市项目为例进行说明. 数字孪生是一种虚拟模 ...
- zabbix-server 报错记录
数据库磁盘满导至zabbix挂了 登陆zabbix页面提示错误信息,查看系统磁盘: /目录已满,导致mariadb数据库无法正常运行,如果有介质将会一直收取: 解决方法:扩容/目录,达到理想值,重启m ...
- 618大促,电商企业如何拔得头筹,“敏捷+ DevOps”有话说
前言 当今企业发展不再以大为目标,而更多追求强和快,因为只有后者才能适应时代变化让企业处以不败之地,我们称这个时代为快鱼吃大鱼的时代,追求快和强也是企业的新形态. 传统行业小到菜场经济,大到航空航天, ...
- 测试攻城狮必备技能点!一文带你解读DevOps下的测试技术
[摘要]本文将从DevOps模式下对测试人员的活动的变化,以及常用的测试技术层面进行解读. 项目的软件开发模式主要经历瀑布模型.敏捷开发和DevOps这几个阶段,其中DevOps主要解决开发和运维.运 ...
- 如何用AscendCL的接口开发网络模型推理场景下应用?
摘要:本期我们来深入讲解网络模型推理场景下,具体怎么做. 本文分享自华为云社区<[CANN文档速递09期]应用开发之推理场景>,作者: 昇腾CANN . 我们知道,使用AscendCL接口 ...
- Shell:Lite OS在线调试工具知多少
摘要:Shell作为Huawei Liteos在线调试工具,可以通过串口工具输入输出,支持常用的基本调试功能.同时用户可以新增定制的命令,新增命令需重新编译烧录后才能执行 本文分享自华为云社区< ...