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


相关推荐

  • 过分了,别人用来做桌面应用开发,这家伙却用来撩妹(1)–上帝给你开一个窗口(Tkinter)

    过分了,别人用来做桌面应用开发,这家伙却用来撩妹(1)–上帝给你开一个窗口(Tkinter)

    2022年2月20日
    38
  • 一文解读光纤收发器单模和多模的区别![通俗易懂]

    一文解读光纤收发器单模和多模的区别![通俗易懂]光纤收发器是进行光电信号转换的设备,现在光纤收发器的技术越发成熟,应用也越来越广泛,所以我们在选择或者采购光纤收发器时,对光纤收发器做一定的了解是有好处的,接下来我们就来给大家详细介绍一下光纤收发器的单模和多模的区别?一起来看看吧!光纤收发器有单模和多模之分,其最根本的区别就是传输距离远近。单模光纤收发器的工作模式是单节点、一个端口信号传输,所以信号传输距离比较长,组成跨城域局域网的建设;多模光纤收发器就刚好相反,其工作模式是多节点、多端口信号传输,所以信号传输距离比较短,但是价格低、使用方便,多用

    2022年10月21日
    5
  • android 锁屏壁纸时钟,桌面锁屏时钟下载-桌面锁屏时钟app安卓版v2.8.0-七度网「建议收藏」

    android 锁屏壁纸时钟,桌面锁屏时钟下载-桌面锁屏时钟app安卓版v2.8.0-七度网「建议收藏」桌面锁屏时钟app是一款非常便捷的桌面锁屏时钟软件,桌面锁屏时钟app支持横屏竖屏自由切换,附带普通模式和沉浸模式,可以设置自己的日程提醒安排,桌面锁屏时钟app可以自己设置天气温度显示和背景皮肤,让用户清楚的知道时间。桌面锁屏时钟app特色1.你可以通过APP快速的了解当前的时间信息。2.添加每天的闹钟提醒以后,就可以让自己准时的起床了。3.在APP中设置自己的日程提醒安排,让APP提醒您不忘记…

    2026年4月18日
    4
  • 伪元素的作用_获取iframe中的元素

    伪元素的作用_获取iframe中的元素目标网站红薯中文网获取网页源代码也获取不了这些动态渲染的数据所以用简单的,但是有点麻烦的方法使用selenium执行js,或者直接在浏览器里面执行jsfunctionkkk(){varmyIdElement=document.getElementsByClassName(“context_kw11″);varbeforeStyle=window.getComputedStyle(myIdElement[0],”::before”);returnbeforeStyle.con

    2022年10月12日
    6
  • selenium-PO模式

    selenium-PO模式PO模式:全称pageObject模式,使测试代码具有理想的可维护性参考:​​​​​​PO设计模式|Selenium优点:测试代码与页面的定位代码(如定位器或者其他的映射)相分离. 该页面提供的方法或元素在一个独立的类中,而不是将这些方法或元素分散在整个测试中….

    2022年5月10日
    43
  • python进阶(11)生成器[通俗易懂]

    python进阶(11)生成器[通俗易懂]生成器利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成。但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。

    2022年7月29日
    9

发表回复

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

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