什么是解释垃圾收集如何工作的简单方法?

dre*_*lax 6 language-agnostic garbage-collection

我的注意力很短,所以我无法完成维基百科的文章.

我知道有几种垃圾收集技术,但常见的是"可达性"测试,其中一个对象的收集资格是基于它是否可以被一个有根对象"到达"(根据我的理解,这是一个已知不需要收集的对象).当你想知道某个对象是否可以访问时,你会怎么做呢?你怎么知道在哪里看?

显然,收集器必须知道所有已分配的对象和有根对象.它如何确定每个对象的可达性?

Joe*_*oey 2

我想说,通过遍历指针/引用。原则上,您只需查看一个对象是否仍然有指向它的引用(来自其他对象、当前执行代码的局部变量……)。如果没有,则无法再次获得对此对象的引用(在 Java 等语言中,至少在无法进行指针欺骗的语言中),因此通常可以安全地丢弃该特定对象。

\n\n

使用(或仍在使用)的其他方案例如引用计数,其中每个对象都有一个对其引用的计数器,每次有人获得对该对象的引用时,该计数器必须递增,而每次有人丢失对该对象的引用时,该计数器必须递减。如果我没记错的话,Windows 中的 COM 就是这样工作的。

\n\n

Java 和 .NET 使用(除其他外)分代垃圾收集,其中每个对象最初被假设很快就会消亡(分代假设)。然后,它采用一些优化来保持垃圾收集周期快速,从而不会过多地干扰程序的运行。在过去,GC 在程序运行时锁定程序并不罕见,有时会锁定几秒钟。

\n\n

除此之外,GC通常仅在内存不足时运行,即\xc2\xa0e。积累了太多的死亡物体,需要回收。这就是为什么与非托管应用程序相比,大多数托管应用程序似乎浪费了更多内存,尽管在许多情况下可以通过运行一次 GC 来回收大部分内存。

\n