【问题标题】:What if the gc were optional in go? [closed]如果 gc 在 go 中是可选的怎么办? [关闭]
【发布时间】:2011-12-13 02:01:47
【问题描述】:

这样的语言是否可行,或者 Go 中是否存在绝对需要某种形式的 gc 的特定功能?

注意:我不是反 gc,但来自 C/C++ 背景并从事实时服务器应用程序,我更喜欢保持某种程度的控制如何以及何时获取内存(不能有10 秒的垃圾收集发生在实时运行的中间)。

考虑到我的要求,我的担忧是否现实?还是 go gc 这么好,我的担心是没有根据的?

Go 的 gc 是我对尝试使用 C++ 实时服务器的端口的唯一保留。

【问题讨论】:

  • 您最好单独提出一个问题,专门针对如何衡量 GC 对 go 的运行时影响。
  • 不知道 go,但是十秒(!)垃圾收集听起来不太可能用现代技术。几毫秒的可能性更大,操作系统通常会通过运行病毒扫描程序、唤醒休眠进程和到处交换虚拟内存来造成如此长的延迟。
  • 我没有尝试过 Go 但你的要求很模糊。你最好自己测量它。根据场景,GC 算法可能会妨碍您。以这种笼统的方式提出问题不会给你一个有用的答案。你能容忍多少中断时间?甚至 Windows 也不是实时操作系统。您是在谈论真正的实时还是其他?
  • 感谢您的 cmets,Dan (+1) - 今天晚些时候我会采纳您的建议并发布一个更好的问题。

标签: garbage-collection go


【解决方案1】:

带有可选 GC 的 Go 需要更改语言。这是一个完全有效的 Go 函数,它会让 C 程序员的皮肤爬行:

func foo() *int {
    a := 1
    return &a
}

这很好,因为 Go 编译器会发现变量 a 需要在堆上分配。稍后将被垃圾收集,您不必关心。 (嗯,好吧,在某些情况下你可能会。但大多数时候你不会。)

您可以编造各种编译器会执行此类操作的场景。如果没有垃圾收集器,情况就不一样了。

您可以做一些事情来帮助 GC 时间,但在一定程度上您会抵消该语言的优势。我不愿推荐这些做法,但可以选择:

  • 免费列表
  • 使用 unsafe 包,您甚至可以编写自己的分配器并手动释放内存,但您需要为每种要分配的类型提供一个函数。或者使用反射传入你要分配的类型,返回一个空接口,然后使用类型断言得到具体的值。

底线是,对于具有严格实时要求的应用程序,Go 可能不是一个好的选择。也就是说,我也不认为你会看到任何接近 10 秒的垃圾收集。考虑一下您的真正要求,如果您有任何疑问,请进行一些测量。

如果可以,请尝试最新的 Go 代码。有一些垃圾收集器改进和一些编译器优化导致更少的分配。但是,如果您的发布时间较短,您可能会被当前的稳定版本卡住几个月。

【讨论】:

  • 感谢您的建议 - 很高兴听到有关 go 的新发展。我希望在 go 中,我可以通过执行诸如分配大块而不是分配许多小对象以及编写更紧凑的代码之类的事情来帮助 gc...
  • 是的,免费列表之类的东西可以提供帮助。稍微修改了我的答案。
  • @EvanShaw,对于您给出的示例,您可以摆脱引用计数 GC,并获得确定的运行时间。我认为 CPython 有引用计数 GC,如果用户远离循环数据结构,它就会摆脱它。你不能做类似 Go 的事情吗?
  • @ElazarLeibovich,我想你可以。不过,我不确定 ref 计数与 goroutine 的交互效果如何。
  • @EvanShaw,需要进一步解释吗?为什么你认为引用计数不适用于 goroutine?您是否担心线程安全引用计数的价格? goroutine 是否存在固有的循环引用? CPython 也可以做 CSP,而且似乎可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多