the*_*oom 18 .net c# python garbage-collection
我正在学习来自python的 C#,并希望知道C#垃圾收集器是如何工作的 - 我发现一旦我弄清楚它在幕后做了什么,我就更了解python,并希望避免制作那种菜鸟我在学习python时最初犯的错误.
我一直无法找到任何关于何时收集垃圾的物品的明确解释,并留下诸如此类的问题
对这些问题的回答,甚至更好地清楚地概述实际发生的事情将赢得cookie(或upvotes),如果你的答案与python的做事方式相比更好.我对哪个更好,只是细节不感兴趣.我在programmers.stackexchange上的原始帖子上的答案将非常感谢...
tyl*_*erl 25
dotnet GC引擎是一个标记和扫描引擎,而不是像你在python中习惯的引用计数器引擎.系统不维护对变量的引用计数,而是在需要回收RAM时标记所有当前可访问的指针并删除所有无法访问的指针(因此超出范围).
您可以在此处找到有关其工作原理的更多信息:http:
//msdn.microsoft.com/en-us/library/ee787088.aspx
系统通过从特定的"根"位置(如堆栈上的全局对象和对象)开始查找"可到达"对象,并跟踪这些对象引用的所有对象以及这些对象引用的所有对象,直到构建完整的树为止.这比听起来要快.
引用超出范围不会触发垃圾收集.通常在为新对象分配存储时触发垃圾收集 - 特别是在生成零预算用尽时.即,对象有资格进行垃圾收集和实际收集垃圾之间可能存在显着延迟.正如其他人已经指出的那样,CLR不使用引用计数.相反,它采用了标记和扫描方法.
关于垃圾收集如何工作的所有细节的一个很好的信息来源是Jeffrey Ricther的书籍CLR via C#.本书详细介绍了堆如何分区以及垃圾收集的工作原理.如果您对.NET实现细节感兴趣,强烈建议使用.
| 归档时间: |
|
| 查看次数: |
16441 次 |
| 最近记录: |