object finalized_finalize()方法

object finalized_finalize()方法一、一次标记首先finalize方法是在垃圾回收时,用于确认该对象是否确认被回收的一个标记过程。确认一个对象真正被回收需要经历两次标记过程:可达性分析没有引用,这是第一次标记是否有必要执行finalize方法,如果对象没有重写finalize方法或者finalize方法已经被调用过了,那么finalize方法就是没有必要执行的,没有必要执行finalize方法的对象就会被直接回收。如果对象被判定为有必要执行finalize()方法,那么这个对象将会放置在一个叫做F-Queue的队列之中,并在稍后

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、一次标记

首先finalize方法是在垃圾回收时,用于确认该对象是否确认被回收的一个标记过程

确认一个对象真正被回收需要经历两次标记过程:

  • 可达性分析没有引用,这是第一次标记
    是否有必要执行finalize方法,如果对象没有重写finalize方法或者finalize方法已经被调用过了,那么finalize方法就是没有必要执行的,没有必要执行finalize方法的对象就会被直接回收。如果对象被判定为有必要执行finalize()方法,那么这个对象将会放置在一个叫做F-Queue的队列之中,并在稍后由一个由虚拟机创建、低优先级的finalizer线程去执行它。这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束,这样做的原因是,如果一个对象的finalize()执行缓慢,极端情况下死循环,那么就会导致F-Queue队列中其他对象永久处于等待,甚至导致整个内存回收系统崩溃。

  • finalize()方法是对象逃脱死亡命运的最后一次机会,稍后GC将对F-Queue中的对象进行第二次小规模的标记,如果对象要在finalize()成功拯救自己——只需要重新与引用链上的任何一个对象建立关联即可,譬如把this关键字赋值给某个类的变量或者对象的成员变量,那么第二次标记时它将会被移出“即将回收”的集合;如果对象这时还没有逃脱,那么它就真正被回收了

/** * Finalizer方法逃避GC * 但是只能逃避一次 * create by chenxichao */
public class FinalizerEscapeGc { 
   

    public static FinalizerEscapeGc SAVE_HOOK = null;

    public void isAlive(){ 
   
        System.out.println("yes i am still alive :)");
    }

    @Override
    protected void finalize() throws Throwable { 
   
        super.finalize();
        System.out.println("finalize method execute");
        FinalizerEscapeGc.SAVE_HOOK = this;
    }

    public static void main(String[] args) throws Exception{ 
   
        SAVE_HOOK = new FinalizerEscapeGc();

        //对象第一次成功拯救自己
        SAVE_HOOK = null;
        System.gc();
        //因为finalize方法的优先级很低,所以睡一下
        Thread.sleep(500);
        if(SAVE_HOOK != null){ 
   
            SAVE_HOOK.isAlive();
        }else{ 
   
            System.out.println("no i am dead");
        }


        //第二次自救失败
        SAVE_HOOK = null;
        System.gc();
        //因为finalize方法的优先级很低,所以睡一下
        Thread.sleep(500);
        if(SAVE_HOOK != null){ 
   
            SAVE_HOOK.isAlive();
        }else{ 
   
            System.out.println("no i am dead");
        }
    }
}

二、 总结

  • finalize方法不是一定会执行,只有在该方法被重写的时候才会执行 f
  • inalize方法只会被执行一次
  • 对象可以在finalize方法中获得自救,避免自己被垃圾回收,同样自救也只能一次
  • 不推荐Java程序员调用该方法,因为finalize方法代价很大
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191991.html原文链接:https://javaforall.net

(0)
上一篇 2026年1月21日 下午1:15
下一篇 2026年1月21日 下午1:43


相关推荐

  • C# ZIP文件的压缩和解压缩(SharpZipLib.dll)

    C# ZIP文件的压缩和解压缩(SharpZipLib.dll)真是折腾呀,网上虽然有不少的源码但测试几个就是不成功,经过折腾还是折腾出来了现在分享出来给大家。源码还是在网友们的基础上调整的,主要是调整源码大大小写格式。sharpziplib.dll下载:http://pan.baidu.com/share/link?shareid=1016448925&uk=134565274&fid=3214033513首先需要在项目里引用sharp

    2022年7月26日
    6
  • VScode 配置 Java 环境

    VScode 配置 Java 环境VScode 配置 Java 环境 1 VisualStudio 介绍 VisualStudio 简称 VSCode 是 Microsoft 在 2015 年 4 月 30 日 Build 开发者大会上正式宣布一个运行于 MacOSX Windows 和 Linux 之上的 针对于编写现代 Web 和云应用的跨平台源代码编辑器 可在桌面上运行 并且可用于 Windows macOS 和 Linux 它具有对 JavaScript TypeScript 和 Node js 的内置支持 并具有丰富的其他语言 例如

    2025年6月29日
    7
  • C++的函数重载

    C++的函数重载每个现象后面都隐藏一个本质 关键在于我们是否去挖掘写在前面 函数重载的重要性不言而明 但是你知道 C 中函数重载是如何实现的呢 虽然本文谈的是 C 中函数重载的实现 但我想其它语言也是类似的

    2026年3月17日
    2
  • tle代码

    tle代码include iostream include string include cstring usingnamespa typedeflongl intn k 1 p 0 maxn strings intmain cin gt gt n cin gt amp cstring string iostream

    2025年6月23日
    3
  • Oracle数据库基础教程:入门其实很简单

    Oracle数据库基础教程:入门其实很简单Oracle 数据库基础教程 入门其实很简单 Oracle 数据库系统是目前最流行的客户 服务器数据库之一 本文集从初学者的角度出发 由浅入深 循序渐进地介绍了 Oracle 数据库开发的基础知识 此外 文集对数据库基本理论及其在数据库开发过程中的应用也有详细介绍 详细解读和小伙伴们一起来吐槽

    2026年3月26日
    1
  • Git、Gitlab与Github区别

    Git、Gitlab与Github区别Git 是一种版本控制系统 是一个命令 是一种工具 Github Gitlab 等产品都是第三方基于 git 这项技术开发的 Github 是一个基于 git 实现的在线代码仓库 包含一个网站界面 向互联网开放 Gitlab 是一个基于 git 实现的在线代码仓库软件 你可以用 gitlab 自己搭建一个类似于 github 一样的系统 一般用于在企业 学校等内部网络搭建 git 私服作者 w0916 链接

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号