广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java详解对象终止方法finalize()的用法
  • 281
分享到

Java详解对象终止方法finalize()的用法

2024-04-02 19:04:59 281人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

finalize()方法机制 Java 语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑。 当GC去回收垃圾时, 总会在即将回收之前

finalize()方法机制

Java 语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑。

GC去回收垃圾时, 总会在即将回收之前调用这个对象的 finalize()方法 , 一个对象finalize()方法只会被调用一次

finalize()方法可以被重写,通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件、套接字和数据库连接等。

我们一般最好不要主动去调用对象的finalize()方法, 理由有以下三点 :

1.在 finalize()时可能会导致对象复活。

2.finalize()方法的执行时间是没有保障的,它完全由 GC 线程决定,极端情况下,若不发生 GC,则 finalize()方法将没有执行机会。

3.一个糟糕的 finalize()会严重影响 GC 的性能。比如 finalize 是个死循环。

为什么会有这种机制呢 ?

我们先来了解 JVM 为对象定义的三种状态

第一次被 jvm 标为垃圾的对象此时处于"缓刑"阶段, 也就是说它此时并不是非死不可的

可触及的:从根节点开始,可以到达这个对象。

可复活的:对象的所有引用都被释放,但是对象有可能在 finalize()中复活。

不可触及的:对象的 finalize()被调用,并且没有复活,那么就会进入不可触及状态。不可触及的对象不可能被复活,因为 finalize()只会被调用一次。

以上 3 种状态中,是由于 finalize()方法的存在,进行的区分。只有在对象不可触及时才可以被回收

可触及的, 意思就是说, 对象此时存在引用链, 是存活的, 可复活的意思是说, 此对象虽然已经被GC标为了垃圾, 但是此时未调用 finalize() 方法, 这个对象是有可能在finalize()中复活的. 不可触及的就是说, 此时finalize()方法已经被调用过了(没有复活), 这个对象最终的命运已经是非死不可了, 只能静等GC去回收它

那么具体的过程是怎样的呢?

判定一个对象 objA 是否可回收,至少要经历两次标记过程:

1.如果对象 objA 到 GC Roots 没有引用链,则进行第一次标记。

2.进行筛选,判断此对象是否有必要执行 finalize()方法

如果对象 objA 没有重写 finalize()方法,或者 finalize()方法已经被虚拟机调用过,则虚拟机视为“没有必要执行”,objA 被判定为不可触及的。

如果对象 objA 重写了 finalize()方法,且还未执行过,那么 objA 会被插入到 F-Queue 队列中,由一个虚拟机自动创建的、低优先级的 Finalizer 线程触发其 finalize()方法执行。finalize()方法是对象逃脱死亡的最后机会,稍后 GC 会对 F-Queue 队列中的对象进行第二次标记。如果 objA 在 finalize()方法中与引用链上的任何一个对象建立了联系,那么在第二次标记时,objA 会被移出“即将回收”集合。之后,对象会再次出现没有引用存在的情况. 在这个情况下,finalize()方法不会被再次调用,对象会直接变成不可触及的状态,也就是说,一个对象的 finalize()方法只会被调用一次。

接着我们用代码演示对象的复活

public class CanReliveObj {
	public static CanReliveObj obj;//类变量,属于 GC Root
	//此方法只能被调用一次
	 @Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("调用当前类重写的finalize()方法");
		obj = this;//当前待回收的对象在finalize()方法中与引用链上的一个对象obj建立了联系
	}
	public static void main(String[] args) {
		try {
			obj = new CanReliveObj();
			// 对象第一次成功拯救自己
			obj = null;
			System.gc();//调用垃圾回收器
			System.out.println("第1次 gc");
			// 因为Finalizer线程优先级很低,暂停2秒,以等待它
			Thread.sleep(2000);
			if (obj == null) {
				System.out.println("obj is dead");
			} else {
				System.out.println("obj is still alive");
			}
			System.out.println("第2次 gc");
			// 下面这段代码与上面的完全相同,但是这次自救却失败了
			obj = null;
			System.gc();
			// 因为Finalizer线程优先级很低,暂停2秒,以等待它
			Thread.sleep(2000);
			if (obj == null) {
				System.out.println("obj is dead");
			} else {
				System.out.println("obj is still alive");
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

执行结果 :

先将引用指向 null , 这时第一次GC , 我们重写了finalize()方法, 致使对象在第一次垃圾回收时成功自救, 第二次再将引用指向null , 因为finalize() 方法只会被执行一次, 这时对象只能等待死亡

到此这篇关于Java详解对象终止方法finalize()的用法的文章就介绍到这了,更多相关Java finalize()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java详解对象终止方法finalize()的用法

本文链接: https://www.lsjlt.com/news/148385.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java详解对象终止方法finalize()的用法
    finalize()方法机制 Java 语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑。 当GC去回收垃圾时, 总会在即将回收之前...
    99+
    2022-11-13
  • Java中终止线程的方法详解
    Java中终止线程的方式主要有三种:使用stop()方法,已被弃用。原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的“残疾”数据,不符合完整性,所以被废弃。...
    99+
    2023-05-31
    java 终止线程 ava
  • 怎么在Java对finalize方法实现禁止
    这篇文章将为大家详细讲解有关怎么在Java对finalize方法实现禁止,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是finalize方法finalize()方法被定义在Java.la...
    99+
    2023-05-31
    java finalize fin
  • Java之对象销毁和finalize方法的使用
    目录对象的销毁finalize方法GC对对象的回收在finalize方法中,是否重新给自己指定一个引用来避免被GC回收?如果finalze方法中出现死循环会发生什么?如果对象的创建出...
    99+
    2022-11-13
  • Java对象销毁和finalize方法怎么使用
    这篇文章主要介绍了Java对象销毁和finalize方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java对象销毁和finalize方法怎么使用文章都会有所收获,下面我们一起来看看吧。对象的销毁在C...
    99+
    2023-07-02
  • 关于Java中finalize析构方法的作用详解
    目录一. 析构方法1. 概念2. 作用3. 特点二. 基本使用1. finalize简介2. 代码案例2.1 Counter计数器2.2 CounterTest测试类四. 结语一. ...
    99+
    2023-05-19
    Java finalize析构方法 Java析构方法作用 Java finalize
  • Java String对象使用方法详解
    Java String对象使用方法详解先来看一个例子,代码如下: public class Test { public static void main(String[] args) { String str = "abc"; ...
    99+
    2023-05-31
    java string ava
  • Java中对象数组的使用方法详解
    在Java中,对象数组是一种特殊类型的数组,可以存储任意类型的对象。以下是关于Java对象数组的使用方法的详细解释:1. 声明对象数...
    99+
    2023-08-15
    Java
  • JavaScript对象扩展方法的用法详解
    目录name 属性属性的遍历super关键字Object.is()Object.assign()Object.getOwnPropertyDescriptors()Object.se...
    99+
    2022-11-13
    JavaScript对象扩展 JavaScript对象方法及其扩展
  • Java对象方法的调用执行过程详解
    目录对象方法的调用执行过程调用方法的几种方式第一种第二种第三种对象方法的调用执行过程 编译器查看对象的声明类型和方法名。假设调用x.f(param),隐式参数为x声明为C类对象,需要...
    99+
    2022-11-13
  • 详解处理Java中的大对象的方法
    目录String中的substring集合大对象扩容保持合适的对象粒度Bitmap 把对象变小数据的冷热分离数据双写写入 MQ 分发使用 Binlog 同步思维发散小结本文我们将讲解...
    99+
    2022-11-13
  • 【Java 基础】类和对象 & 方法重载详解
    《Java 零基础入门到精通》专栏持续更新中。通过本专栏你将学习到 Java 从入门到进阶再到实战的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。 ...
    99+
    2023-10-10
    java 开发语言 后端
  • JAVA面对对象的应用方法
    这篇文章主要介绍“JAVA面对对象的应用方法”,在日常操作中,相信很多人在JAVA面对对象的应用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JAVA面对对象的应用方法”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • java中跳出或终止if语句的方法
    breakbreak:跳出当前循环;但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环。for (int i = 0; i < 10; i++) { if (i == 6) { ...
    99+
    2019-09-26
    java基础 java 跳出 if语句 方法 终止
  • Java中判断对象是否为空的方法详解
    在Java编程中,经常会遇到判断对象是否为空的情况。空指针异常是常见的程序错误之一,因此在编码过程中,判断对象是否为空是一个重要的防御措施。本篇博客将深入探讨Java中判断对象是否为空的不同方法,...
    99+
    2023-09-01
    java python 开发语言
  • Java对象数组定义与用法详解
    Java对象数组是一种用于存储多个相同类型的对象的数据结构。它可以按照一定的顺序存储和访问对象,并且可以根据需要进行动态调整大小。要定义一个对象数组,可以使用以下语法:```ClassName[] arrayName = new Cla...
    99+
    2023-08-09
    Java
  • 【Java 基础】类和对象 & 方法重载详解
    《Java 零基础入门到精通》专栏持续更新中。通过本专栏你将学习到 Java 从入门到进阶再到实战的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。 订阅专栏后添加我微信或者进交流群,...
    99+
    2023-08-21
    java 开发语言 后端
  • 详解Java停止线程的四种方法
    一、线程停止基础知识 interrupted(): 测试当前线程是否已经中断。该方法为静态方法,调用后会返回boolean值。不过调用之后会改变线程的状态,如果是中断状态...
    99+
    2022-11-12
  • Java比较两个对象大小的三种方法详解
    目录一. 为什么需要比较对象二. 元素的比较1. 基本类型的比较 2. 引用类型的比较 三. 对象比较的方法1. equals方法比较2. 基于Comparabl...
    99+
    2022-11-13
  • Java中通过Class类获取Class对象的方法详解
    前言本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:阅读API的Class类得知,Class 没有公共构造方法。Class 对象是在加载类时由 J...
    99+
    2023-05-31
    java class类 class对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作