当前位置: 首页 > 面试题库 >

C#中的垃圾收集和作用域如何工作?[重复]

慕容齐智
2023-03-14
问题内容

我正在学习来自python的,并希望了解C#垃圾收集器的工作原理-
我发现弄清了幕后行为后,我对python有了更多的了解,并且希望避免出现这种麻烦。我最初在学习python时犯的错误。

我无法找到关于何时将项目垃圾回收并留下诸如以下问题的任何清晰明了的解释

  1. “对象的最后一个引用超出范围时会发生什么?” 当您返回到定义对象的范围时,该对象是否被垃圾回收了?
  2. “在什么时候引用数量会减少?” 让我想知道它是否甚至使用引用计数或其他某种技术…

对这些问题的答案,或者什至更好地简明扼要地概述实际发生的事情,将赢得cookie(或赞誉),并且如果您的答案将其与python的做事方式进行比较,甚至会更好。我对哪个更好,只是细节不感兴趣。另外我对程序员的原始帖子的答案.stackexchange将不胜感激…


问题答案:

dotnet
GC引擎是标记扫描引擎,而不是像python中那样的引用计数器引擎。系统不维护对变量的引用计数,而是在需要回收RAM,标记所有当前可访问的指针并删除所有不可访问的指针时运行“集合”。超出范围)。

您可以在此处找到有关其工作原理的更多信息:http :
//msdn.microsoft.com/zh-
cn/library/ee787088.aspx

系统从特定的“根”位置开始查找“可达”对象,例如全局对象和堆栈上的对象,并跟踪这些对象引用的所有对象以及这些对象引用的所有对象,等等,直到构建完整的树为止。这比听起来快。



 类似资料:
  • 问题内容: 有人可以解释一下G1垃圾收集器的工作原理吗?我还无法在任何地方找到任何全面,易于理解的描述。 谢谢 问题答案: 收集器将堆分成固定大小的区域,并跟踪这些区域中的实时数据。它将一组指针(“记住的集”)保留在区域内和区域外。当认为有必要使用GC时,它将首先收集实时数据较少的区域(因此,“垃圾优先”)。通常,这意味着一步就可以收集整个区域:如果进入一个区域的指针数量为零,则无需对该区域进行标

  • 问题内容: JavaScript中的垃圾回收如何工作?它类似于.NET垃圾回收吗?难道是因为人们在VBScript中实现垃圾回收很不好,所以人们避免了垃圾回收并建立了对JavaScript作为其标准客户端语言的偏好? 问题答案: 垃圾收集如何工作? 简短的答案是:当某个内存块(例如某个对象)不再可访问时,有资格回收它。何时,如何回收或是否回收它完全取决于实现,并且不同的实现方式也不同。但是在语言级

  • 问题内容: 是否有可能使Go中的垃圾收集器处理并释放通过C代码分配的内存?抱歉,我之前没有使用过C和cgo,因此我的示例可能需要澄清。 假设您有一些要使用的C库,并且该库分配了一些需要手动释放的内存。我想做的是这样的: 当Go运行时中没有对* Stuff的引用时,垃圾收集器是否可以调用Stuff.Free()? 我在这里有意义吗? 也许更直接的问题是:是否有可能通过编写一个在该对象的引用为零时运行

  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner

  • 问题内容: 我有一段代码可以在内存中加载很大的图像。所以打电话似乎是合理的事情 在加载图像之前。据我所知,它毫无问题。 昨天,我决定使用一个名为FindBugs的非常有用的软件来扫描您的代码并报告可能导致错误或通常不建议使用的策略的问题。问题是我提到的这段代码得到了报告。描述是这样的: …强迫垃圾收集;除了基准测试代码外,都非常可疑 并继续阐述: 代码显式调用垃圾回收。除了基准测试中的特定用途外,

  • 我遇到了一个JNI程序随机内存不足的问题。 这是一个32位java程序,它读取文件,进行一些图像处理,通常使用250MB到1GB。然后丢弃所有这些对象,然后程序对通常需要100-250MB的JNI程序进行一系列调用。 当交互运行时,我从未见过问题。但是,当对许多文件连续运行批处理操作时,JNI程序将随机运行内存溢出。它可能对一个或两个文件有内存问题,然后对下一个10个文件运行正常,然后再次出现故障