Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.net中,CLR如何知道特定对象已准备好进行垃圾收集?_C#_.net_Clr - Fatal编程技术网

C# 在.net中,CLR如何知道特定对象已准备好进行垃圾收集?

C# 在.net中,CLR如何知道特定对象已准备好进行垃圾收集?,c#,.net,clr,C#,.net,Clr,我很好奇clr如何知道某个对象没有被任何其他对象使用,它是死的我们知道垃圾收集器的基本原理,但在内部clr如何找到死的对象。clr如何知道对象处于死的位置。 垃圾收集有以下几个阶段: 查找并创建所有活动对象列表的标记阶段 一个重定位阶段,用于更新对所选对象的引用 将被压实 一个压缩阶段,回收死者占用的空间 对象并压缩幸存的对象。压实阶段 将经过垃圾收集的对象移到 段的较旧端 垃圾收集器使用以下信息确定对象是否处于活动状态: 堆叠根。即时(JIT)提供的堆栈变量 编译器和堆栈遍历器 垃圾收集

我很好奇clr如何知道某个对象没有被任何其他对象使用,它是死的我们知道垃圾收集器的基本原理,但在内部clr如何找到死的对象。clr如何知道对象处于死的位置。

垃圾收集有以下几个阶段:

  • 查找并创建所有活动对象列表的标记阶段
  • 一个重定位阶段,用于更新对所选对象的引用 将被压实
  • 一个压缩阶段,回收死者占用的空间 对象并压缩幸存的对象。压实阶段 将经过垃圾收集的对象移到 段的较旧端
垃圾收集器使用以下信息确定对象是否处于活动状态:

  • 堆叠根。即时(JIT)提供的堆栈变量 编译器和堆栈遍历器

  • 垃圾收集句柄。处理指向托管对象和 可以由用户代码或公共语言运行库分配

  • 静态数据。应用程序域中的静态对象可能是 引用其他对象。每个应用程序域都跟踪其 静态对象


理解垃圾收集机制的可能重复,但clr如何知道它已准备好进行垃圾收集?简短回答:当对象不再可访问时,它已死亡。详细回答:不再可访问的对象由一个服务器收集。阅读并了解它是如何在CLR中实现的(以及如何定义可访问的对象)。完全没有任何研究工作,web上到处都是关于CLR的文章,谷歌的“垃圾收集器标记和清理阶段”是基础文章。