CLR via C# 读书笔记 5-3 对象复活(Resurrection)
2010-12-08 16:38
232 查看
1. 对象复活
当GC想调用一个对象的Finalize方法的时候
GC会强制这个对象处于 活 的状态
只有当Finalize方法调用完成以后,这个对象才会永久的消失
主要原因是:Finalize方法中可能使用到这个对象的字段(Field),所以Finalize的过程中需要保证可以访问这些字段,所以要保证对象处在 活的状态
当Finalize方法执行完成的时候,这个对象才会真正的消失
2. 应用场景
一般情况下需要尽量避免使用对象复活,除非是一个对象需要被重复的使用,(其实我觉得还不如不回收这个对象呢,就让他一直活着吧)
3.当一个静态字段被Finalize的时候
当SomeType对象的Finalize方法被调用的时候,由于 有一个根节点引用了SomeType,同时SomeType这个对象被移动到Freachable队列中,这里就发生了对象复活,不过这个时候SomeType对象处在不可预料的情况 (- - 为了程序的稳定最好还是别用他)
PS:一个有Finalize方法的对象需要两次GC才会真正的挂掉
PS: 不知道怎么翻译freachable queue...- -
当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...- -
相关文章推荐
- CLR via C# 读书笔记(四).net平台对象在托管堆上的内存分配
- CLR via C# 读书笔记(九)静态类,类型对象的生存周期
- [CLR via C#]5.4 对象哈希码和dynamic基元类型
- 《CLR via C#》读书笔记-.NET多线程(四)
- 《CLR via C#》读书笔记(6)类型和成员基础
- CLR via C# 3 读书笔记(2):第1章 CLR执行模型 — 1.2 将托管模块组合为程序集
- CLR via C# 3 读书笔记(5):第1章 CLR执行模型 — 1.5 本地代码生成器工具:NGen.exe
- 【读书笔记】《框架设计(第2版)CLR Via C#》中两个比较有趣的知识点
- CLR via C# 读书笔记 1-2 创建线程的成本
- CLR via C# 读书笔记 5-6 垃圾回收的Generation
- 读书笔记—CLR via C#异常和状态管理
- 读书笔记—CLR via C#线程25-26章节
- <NET CLR via c# 第4版> 读书笔记--目录
- 《CLR via C#》读书笔记之:类型基础
- 《CLR via C#》读书笔记-异步编程(五)
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_对象的相等性和同一性
- CLR via C# 3 读书笔记(7):第1章 CLR执行模型 — 1.7 通用类型系统
- 《CLR via C#》读书笔记-.NET多线程(六)
- 《CLR via C#》读书笔记---11事件
- 《CLR via C#》读书笔记(4) -- const与readonly的区别