zoukankan      html  css  js  c++  java
  • 对象生命周期中至少被GC一次后存活

    Finalize调用流程:GC时,当对象变成(GC Roots)不可达时,若该对象覆盖(重写)了finalize方法并且未执行过finalze方法,则将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法;否则直接将其回收。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。

    system.gc()并不是你调用就马上执行的, 而是根据虚拟机的各种算法来来计算出执行垃圾回收的时间,另外,程序自动结束时不会执行垃圾回收的。其次:对象被回收时,要经过两次标记,第一次标记,如果finalize未被重写,或者finalize被调用过,那么垃圾回收并不会去执行finalize,否则会执行finalize方法;第二次标记,如果对象不能在finalize中成功拯救自己,那真的就要被回收了

    实例如下:

    public class FinalizeEscapseGC {

    public static FinalizeEscapseGC gcObject = null;

    public static FinalizeEscapseGC fe = null;

     

    public void isAlive() {

    System.out.println("I am still Alive");

    }

     

    @Override

    protected void finalize() throws Throwable {

    super.finalize();

    System.out.println("finalize method excute");

    FinalizeEscapseGC.gcObject = this;

    }

     

    public static void main(String[] args) throws InterruptedException {

    gcObject = new FinalizeEscapseGC();

    gcObject = null;

    System.gc();//因为finalize方法被重写了,并且还没有被调用,所以此时会调用finalize方法

    Thread.sleep(500);

    if (gcObject != null) {

    gcObject.isAlive();

    } else {

    System.out.println("gcObject is dead");

    }

    gcObject = null;

    System.gc();//此时因为finalize方法已经被调用了,所以不会再调用;该对象会被直接回收

    Thread.sleep(500);

    if (gcObject != null) {

    gcObject.isAlive();

    } else {

    System.out.println("gcObject is dead");

    }

    }

    }

    结果如下:

    finalize method excute//第一次gc时调用finalize方法

    I am still Alive//调用finalize后,对象被救活

    gcObject is dead//第二次调用gc不再执行finalize方法,直接回收

    参考链接:https://blog.csdn.net/h2604396739/article/details/78125305

  • 相关阅读:
    工作流-1
    net core体系-Xamarin-2概要(lignshi)
    net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了
    手机支持NFC
    net core体系-Standard-1概述
    运营-赵本山最近有点烦:二人转产业链滑铁卢 关联公司IPO预披露
    MSSql-1内部数据库版本号
    (JAVA保留小数问题,基础)Probability hdu2131
    (stripTrailingZeros)A == B hdu2054
    (reverse)Palindromes hdu2163
  • 原文地址:https://www.cnblogs.com/xiohao/p/8973505.html
Copyright © 2011-2022 走看看