加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 循环引用对象的垃圾收集

发布时间:2020-12-15 08:42:29 所属栏目:百科 来源:网络整理
导读:假设我有2个对象 – 对象A和对象B.对象A引用对象B,对象B引用对象A. 如果对象A和A都是对象B不在代码的引用范围内 – 垃圾收集器如何知道它可以被收集. 垃圾收集器如何推断出任何对象超出范围/准备好进行垃圾回收? 如果对象A不是由我们的代码引用但仍然可以是
假设我有2个对象 – 对象A和对象B.对象A引用对象B,对象B引用对象A.

>如果对象A和A都是对象B不在代码的引用范围内 – 垃圾收集器如何知道它可以被收集.
>垃圾收集器如何推断出任何对象超出范围/准备好进行垃圾回收?
>如果对象A不是由我们的代码引用但仍然可以是独立的,那该怎么办?例如.如果它是一个Form类,那么它即使对象A重新初始化为新实例或指定为null也可以自行运行.

解决方法

> GC不会选择一个对象并查看是否有任何引用它;保持它,如果它. GC有一个它知道“活着”的每个对象的集合.此集合以所有静态变量,堆栈上的所有变量以及一些其他特殊情况开始.然后它会遍历每个“活着”的对象并查看它们引用的对象.每个引用的对象本身都标记为“活动”,因为它意味着它可以通过另一个活动对象以某种方式到达.它会重复此过程,直到找不到新对象.然后,任何未被标记为活着的东西都是无法到达的.正如您所知,由于您从未检查过任何给定的“死”对象引用的内容,因此无论是否存在循环引用都是不相关的. >见#1. >嗯,在大多数情况下,它实际上是在某处引用的;例如,在表单的情况下,您有Application.OpenForms引用任何打开的表单.对于诸如这些的对象,通常存在类似的构造.在极少数情况下,如计时器这样的对象,GC会明确告知它们不会被收集.这种情况非常罕见,您通常不需要担心它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读