我的注意力持续时间很短,所以我无法通过维基百科文章 http://en.wikipedia.org/wiki/Garbage_Collection.
我知道垃圾收集有多种技术,但常见的一种是“可达性”测试,其中对象的收集资格取决于它是否可以被根对象“到达”(据我所知,这是一个已知不需要收集的对象)。当你想知道某个对象是否可达时,你会怎么做?你怎么知道去哪里看?
收集器显然必须知道所有分配的对象和根对象。它如何确定每个对象的可达性?
我想说,通过遍历指针/引用。原则上,您只需查看一个对象是否仍然有指向它的引用(来自其他对象、当前执行代码的局部变量……)。如果没有,则无法再次获得对此对象的引用(在 Java 等语言中,至少在无法进行指针欺骗的语言中),因此通常可以安全地丢弃该特定对象。
使用(或仍在使用)的其他方案例如引用计数,其中每个对象都有一个对其引用的计数器,每次有人获得对该对象的引用时,该计数器必须递增,而每次有人丢失对该对象的引用时,该计数器必须递减。如果我没记错的话,Windows 中的 COM 就是这样工作的。
Java 和 .NET 使用(以及其他)分代垃圾收集,其中每个对象最初被假设很快就会消亡(分代假设)。然后,它采用一些优化来保持垃圾收集周期快速,从而不会过多地干扰程序的运行。在过去,GC 在程序运行时锁定程序并不罕见,有时会锁定几秒钟。
除此之外,GC 通常仅在内存不足时运行,即。 e.积累了太多的死亡物体,需要回收。这就是为什么与非托管应用程序相比,大多数托管应用程序似乎浪费了更多内存,尽管在许多情况下可以通过运行一次 GC 来回收大部分内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)