gpt4 book ai didi

garbage-collection - 为什么需要垃圾回收?

转载 作者:行者123 更新时间:2023-12-04 09:52:08 27 4
gpt4 key购买 nike

假设堆上的一个对象超出范围。为什么程序不能在范围结束后立即释放内存?或者,如果我们有一个指向一个对象的指针,该指针被一个新对象的地址替换,为什么程序不能在分配新对象之前释放旧对象?我猜不是立即释放它而是在稍后的时间点异步完成释放会更快,但我不确定。

最佳答案

Why is garbage collection necessary?



这不是绝对必要的。如果有足够的时间和精力,您总是可以将依赖垃圾收集的程序转换为不依赖垃圾收集的程序。

通常,垃圾收集涉及权衡。

一方面,垃圾收集允许您编写应用程序而无需担心内存分配和释放的细节。 (以及因解除分配逻辑错误而导致的调试崩溃和内存泄漏的痛苦。)

垃圾收集的缺点是您需要更多内存。如果一个典型的垃圾收集器没有足够的空闲空间,它的效率就会很低。

相比之下,如果您进行手动内存管理,您可以编写应用程序以在不再使用堆对象时立即释放它们。此外,当 GC 执行其操作时,您不会遇到尴尬的“暂停”。

手动内存管理的缺点是您 必须编写决定何时调用 free 的代码,还有你 必须得到它正确。此外,如果您尝试通过引用计数来管理内存:
  • 每当指针被赋值或变量超出范围时,你都会增加和减少引用计数,
  • 您必须处理数据结构中的循环,以及
  • 当您的应用程序是多线程的并且您必须处理内存缓存、同步等时,情况会更糟。


  • 就其值(value)而言,如果您使用一个不错的垃圾收集器并对其进行适当调整(例如,为其提供足够的内存等),那么当您将 GC 和手动存储管理应用于大型应用程序时,它们的 CPU 成本是可比的。

    引用:
  • "The measured cost of conservative garbage collection"本杰明佐恩


  • 1 - 这是因为现代收集器的主要成本是遍历和处理非垃圾对象。如果没有很多垃圾,因为你对堆空间很吝啬,GC 会做很多工作,但返回很少。见 https://stackoverflow.com/a/2414621/139985进行分析。

    关于garbage-collection - 为什么需要垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61999527/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com