none
如何获取一个对象实例的引用计数值? RRS feed

  • 问题

  • 如何在运行时获取当前某个对象实例的引用计数值(即有多少个仍在生存期的对象正在引用着它)?
    如果做不到准确计数的话,那么能否判断出某个对象实例是否仅被一个对象所引用?
    2010年1月6日 6:46

答案

  • 你好!
         你这个问题我们过去也讨论过,实际上CLR在进行JIT编译的时候会生成一个内部表来管理方法中的”根“,也就是引用!然后在垃圾回收的时候通过构造可达对象图来决定那些对象可以进行垃圾回收!
         所以,CLR本身可以获得引用计数的,但是并没有提供给程序员获取的方法!某个对象实例是否仅被一个对象所引用这个也是没有办法判断的!
         不知道你的需求是怎样的,但是这个工具可以交给CLR来自动处理,一般我们无须自己做处理啊!
        
    周雪峰
    2010年1月6日 14:25
    版主

全部回复

  • 应该可以,因为GC进行垃圾回收时会做类似的工作。
    你可以往这方面看看。

    快乐在于能够长时间的为自己认为值得的事情努力工作,不管它是什么。
    2010年1月6日 7:38
  • 你好!
         你这个问题我们过去也讨论过,实际上CLR在进行JIT编译的时候会生成一个内部表来管理方法中的”根“,也就是引用!然后在垃圾回收的时候通过构造可达对象图来决定那些对象可以进行垃圾回收!
         所以,CLR本身可以获得引用计数的,但是并没有提供给程序员获取的方法!某个对象实例是否仅被一个对象所引用这个也是没有办法判断的!
         不知道你的需求是怎样的,但是这个工具可以交给CLR来自动处理,一般我们无须自己做处理啊!
        
    周雪峰
    2010年1月6日 14:25
    版主
  • 我的需求是这样的: 我要编写一个类,但要让它表现出值类型的性质,就像string类一样,能够CopyOnWrite,也就是说当把该类的一个变量赋值给另一个变量时只复制引用(浅复制),而在要改变引用同一对象的多个变量中的一个变量的值(包括其内部字段的值)时,能够先自动把值复制一份(深复制)再修改,以达到不影响其他变量的值的目的.
    而为了进一步优化,我又不希望这个类完全像string类一样稍有改变就复制一份.我希望在要修改值的时候,该类能够自动检测要被修改的对象是否同时被多个变量所引用,如果是,则先深复制再修改;如果要被修改的对象仅被一个变量引用的话,那么就可以直接在这个对象上修改而无需构造新对象,这样可以减少垃圾回收,提高效率.
    有没有什么好办法能够实现上述需求?
    2010年1月6日 16:05
  • 你好!
         string类的这个行为应该是CLR做的特殊处理,所以我认为你自己无法实现这样的类!
    周雪峰
    • 已建议为答案 062369 2010年1月7日 4:21
    2010年1月7日 4:11
    版主
  • 自己实现估计不太可能。


    你可以考虑实现一个Clone()的方法,相比new()一个对象来说,稍微好点。

    • 已建议为答案 Lyman Ma 2011年7月25日 4:59
    2010年1月8日 3:34