本帖最后由 littlecc2009 于 2010-08-28 16:27:26 编辑

解决方案 »

  1.   

    "第二本书"讲CLR如何"创建一个存活对象的链表"。如果B的一个实例b存活着,那么通过元数据表描述,知道它有个成员A a,a引用b,所以b也应添加到存活对象的链表去:class A{}class B
    {
       A a;
    }
      

  2.   

    更正:
    如果B的一个实例b存活着,那么通过元数据表描述,知道它有个成员A a,b引用a,所以a也应添加到存活对象的链表去:class A{}
    class B
    {
      A a;
    }
      

  3.   


    谢谢你的回答!~
    但是我觉得所谓的存活对象链表指的是从根对象开始,检查对象内对其他对象的引用而创建的链表吧?
    这样的话,对象B内即使有对象A的变量,但是该变量未必有对对象A的引用吧?
    例如:
    class A{}
    class B
    {
      A a=null;
    }所以元数据表应该只是描述对象内有哪些成员,但是该成员并不一定拥有对另一对象的引用吧?
    所以我觉得“通过元数据的描述来创建存活对象链表”好像不正确吧??
    可能我说的不对。。请指教!~~~~~~~谢谢!!!!~~~
      

  4.   

    我的理解是:GC创建一个存活对象链,假设为A1集合,然后通过元数据表描述的对象间的引用关系知道所有的对象,假设为B1集合,然后把在B1不在A1的对象清理掉。“GC创建一个存活对象链,假设为A1集合”应该是指的元数据
    "假设为B1集合" 也应该是指的无数据具体的可以看看 .net框架设计 中关于GC的章节
      

  5.   

    可以看一下这篇文章
    Metadata是.NET平台的核心灵魂 Metadata是.NET支持垃圾收集GC的基础 
    metadata标记了对象与对象间的引用关系,这是GC遍历对象图(判断对象是否可以收集)的关键依据。没有metadata,GC将不知道0×000688是一个指针(需要继续遍历)?还是一个整数(不需要继续遍历)?