我想知道垃圾收集器的最佳选择,它具有优点和缺点。我的首要任务是速度,内存次要。如果有没有任何暂停的垃圾收集器,请告诉我。

我正在使用一种安全的语言(即一种没有悬空的指针,没有检查边界的语言),并且必须使用垃圾回收或其替代方法。

最佳答案

我怀疑您最好坚持使用垃圾收集(根据JVM),除非您有很好的理由。现代GC非常快速,通用且安全。除非您可以将语言设计为利用非常特殊的特殊情况(如上述分配器之一),否则您不可能击败JVM。

如今,我认为反对现代GC的唯一真正令人信服的原因是GC暂停导致的延迟问题。这些很小,很少见,并且对于大多数用途而言并不是真正的问题(例如,我已经成功地用Java编写了3D引擎),但是它们仍然会在非常紧凑的实时情况下引起问题。

话虽如此,在某些特殊情况下,可能还有其他内存分配方案可能有意义,因此我在下面列出了一些有趣的选项:

一种非常快速的专用内存管理方法的示例是许多游戏中使用的“每帧”分配器。这是通过增加单个指针来分配内存来实现的,在一段时间(通常是可视“帧”)结束时,只需将指针设置回基地址并在下一次分配中覆盖它们,即可立即丢弃所有对象。 。这可以是“安全的”,但是对象生存期的约束将非常严格。如果您可以保证所有内存分配均受大小限制并且仅在处理范围内有效,则可能是赢家。单个服务器请求。

另一种非常快速的方法是为不同类的对象提供专用的对象池。释放的对象可以使用诸如空闲对象插槽的链接列表之类的方法在池中进行回收。操作系统通常将这种方法用于通用数据结构。但是,您再次需要注意对象的生存期,并通过将对象返回池来显式处理处置。

引用计数表面上看起来不错,但通常没有意义,因为每当更改指针值时,您都经常必须取消引用并更新两个对象的计数。通常,此成本比具有简单且快速的内存管理的优势更糟,并且在存在循环引用的情况下也不起作用。

堆栈分配非常快,可以安全运行。根据您的语言,可以不使用堆而完全在基于堆栈的系统上运行。但是,我怀疑这会在某种程度上限制您的语言设计,因此可能是一个入门者。对于某些DSL仍可能值得考虑。

如果您对对象的创建和生存期有足够的限制(可以使用您的语言强制执行),那么经典的malloc / free非常快,并且可以使其安全。例如,如果您对指针的使用施加了很大的限制。

无论如何-希望这是有益的食物!

关于memory-management - 垃圾收集器的替代品,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2598089/

10-13 07:10