object finalized_finalize()方法

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


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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pattern 正则_JAVA 正则表达式

    pattern 正则_JAVA 正则表达式1.组(Group)组是正则表达式的一个子集,每个组都有一个编号,通过从左到右计算左括号来进行编号。正则表达式“((A)(B©))”有4个组:((A)(B©))(A)(B©)©组0表示整个正则表达式,除组0外每一个组都被一对括号括住,如果一个正则表达式里面没有括号,则它只有组0即整个表达式。下面是组号的示例程序:Patternp=Pattern.compile(“([0-9]+)([^0-9]+)”);Matcherm1=p.matcher(“namejack,age18

    2022年11月2日
  • python怎么安装matplotlib.pyplot_python安装matplotlib模块

    python怎么安装matplotlib.pyplot_python安装matplotlib模块总结经验,前排感谢CSDN大神…一、在Pycharm中安装matplotlib1、打开AnacondaPrompt,输入pipinstallmatplotlib输入pipinstallmatplotlib==3.3.0限制下载的版本为3.3.0.这是为了防止版本过新,之后在PyCharm运行时出现问题。2、打开PyCharm(1)依次点击File-Settings-…

    2022年8月25日
  • linux查看pid 对应的程序_用户程序可以在内核态下运行吗

    linux查看pid 对应的程序_用户程序可以在内核态下运行吗进程pid和ppid、进程的uid和euid、用户的uid和gid、文件的创建者和所有者的关系辨析1、当我们创建用户时,由我们为新建用户命名和设置密码,同时系统会为我们所创建的用户名关联一个号,就是所谓的用户uid。同时我们还可以把这个用户放到某个用户群里,类似的,用户群也可以我们手工建立。如果建立用户时,不指明所建的用户属于哪个用户群,则系统会自动建立一个跟用户名同名的用户群。不管手工建立还是自…

    2022年11月2日
  • Linux 审计日志记录,linux日志服务器审计客户端history记录「建议收藏」

    Linux 审计日志记录,linux日志服务器审计客户端history记录「建议收藏」需求将每台服务器上的每一个用户执行的命令、执行时间、登陆时间、主机ip、当前切换用户等信息保存到本地并实时传输至日志服务器进行异地保存。nginxIPhostname角色10.10.99.1test1rsyslog-server10.10.99.2test2rsyslog-client工具及服务1.loggerlogger是一个shell接口,能够经过该接口使用rsyslog的日志模块。webus…

    2022年6月4日
  • 常用的perl正则表达式

    常用的perl正则表达式^\d+$  //匹配非负整数(正整数+0) //匹配整数^\d+(\.\d+)?$  //匹配非负浮点数(正浮点数+0) ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$  //匹配正浮点数 ^((-\d+(\.\d+)?)|(0+(\.0+)?))$  //匹配

    2022年5月30日
  • pandas fillna详解

    pandas fillna详解pandas中补全nan具体的参数Series.fillna(self,value=None,method=None,axis=None,inplace=False,limit=None,downcast=None,**kwargs)[source]参数: value:scalar,dict,Series,orDataFrameValuetouset…

    2022年8月12日

发表回复

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

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