哪些垃圾收集算法可以在垃圾对象变成垃圾后立即识别它们?
我想到的唯一一件事是每次引用计数减少到非零值时,都会增加循环搜索的引用计数。
还有其他有趣的收集算法可以实现吗?(请注意,我只是出于好奇而询问;我知道所有此类收集器的效率都可能非常低下)
哪些垃圾收集算法可以在垃圾对象变成垃圾后立即识别它们?
我想到的唯一一件事是每次引用计数减少到非零值时,都会增加循环搜索的引用计数。
还有其他有趣的收集算法可以实现吗?(请注意,我只是出于好奇而询问;我知道所有此类收集器的效率都可能非常低下)
虽然不是垃圾收集算法,但逃逸分析允许推理对象的生命周期。因此,如果效率是一个问题,并且不应该在所有情况下而是在“明显”的情况下收集对象,它可能会很方便。基本思想是执行程序的静态分析(在编译时或加载时,如果为 VM 编译),并确定新创建的对象是否可以逃避创建它的例程(因此分析的名称) . 如果对象没有被传递到其他任何地方,没有存储在全局内存中,没有从给定的例程返回,等等,它可以在从这个例程返回之前,甚至更早,在它最后使用的地方被释放。
存活时间不超过相关方法调用的对象可以分配在堆栈上而不是堆中,因此可以在编译时将它们从垃圾收集周期中删除,从而降低一般 GC 的压力。
这种机制称为“堆管理”,而不是垃圾收集。
根据定义,垃圾收集与堆管理是分离的。这是因为在某些环境/应用程序中,跳过执行“免费”操作并跟踪正在使用的内容会更有效。相反,每隔一段时间,就在周围收集所有未引用的节点并将它们放回空闲列表中。
== 附录 ==
我因为试图用垃圾收集来纠正堆管理的术语而被否决。维基百科的文章同意我的用法,以及我在大学学到的东西,尽管那是几十年前的事了。Lisp 和 Snobol 等语言发明了垃圾收集的需求。诸如 C 之类的语言不提供如此繁重的运行时环境;取而代之的是依靠程序员来管理未使用的内存和资源位的清理。