如果很好说出finalize用法,面试官会认为你很资深

2024-03-03 00:32

本文主要是介绍如果很好说出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用法,面试官会认为你很资深的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/767884

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

Mysql中isnull,ifnull,nullif的用法及语义详解

《Mysql中isnull,ifnull,nullif的用法及语义详解》MySQL中ISNULL判断表达式是否为NULL,IFNULL替换NULL值为指定值,NULLIF在表达式相等时返回NULL,用... 目录mysql中isnull,ifnull,nullif的用法1. ISNULL(expr) → 判

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编