zoukankan      html  css  js  c++  java
  • CLR via C# 读书笔记 53 对象复活(Resurrection)

    1. 对象复活

    当GC想调用一个对象的Finalize方法的时候

    GC会强制这个对象处于 活 的状态

    只有当Finalize方法调用完成以后,这个对象才会永久的消失

    主要原因是:Finalize方法中可能使用到这个对象的字段(Field),所以Finalize的过程中需要保证可以访问这些字段,所以要保证对象处在 活的状态

    当Finalize方法执行完成的时候,这个对象才会真正的消失

    2. 应用场景

    一般情况下需要尽量避免使用对象复活,除非是一个对象需要被重复的使用,(其实我觉得还不如不回收这个对象呢,就让他一直活着吧)

    3.当一个静态字段被Finalize的时候

    internal sealed class SomeType {
    ~SomeType() {
    Program.s_ObjHolder
    = this;
    }
    }
    public static class Program {
    public static Object s_ObjHolder; // Defaults to null

    }

    当SomeType对象的Finalize方法被调用的时候,由于 有一个根节点引用了SomeType,同时SomeType这个对象被移动到Freachable队列中,这里就发生了对象复活,不过这个时候SomeType对象处在不可预料的情况 (- - 为了程序的稳定最好还是别用他)

    PS:一个有Finalize方法的对象需要两次GC才会真正的挂掉

    PS: 不知道怎么翻译freachable queue...- -

  • 相关阅读:
    软件设计原则
    UML 类图
    Lambda 四大内置核心函数式接口
    Lambda 表达式简介
    vuex源码解析及简单实现
    websocket
    module.export / require 和 export / import
    关于form表单提交时required属性失效的问题
    更改mysql引擎后无法建立外键(navicat)
    关于Android studio SDK的安装与配置
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/1900387.html
Copyright © 2011-2022 走看看