当前位置: 首页 > 面试题库 >

Go使用哪种垃圾收集?

陆安国
2023-03-14
问题内容

Go是一种垃圾回收语言:

http://golang.org/doc/go_faq.html#garbage_collection

在这里,它说这是一个标志性的垃圾回收器,但是它没有深入研究细节,并且正在进行替代…但是,自Go发行以来,该段似乎没有太多更新。

它仍然是标记和扫描?是保守还是精确?它是世代相传的吗?


问题答案:

Go 1.4+垃圾收集器的计划:

  • 混合世界/并发收集器
  • 截止日期限制为10毫秒
  • 专门用于运行并发收集器的CPU内核
  • 三色标记扫掠算法
  • 非世代
  • 不紧凑的
  • 完全精确
  • 如果程序在四处移动指针,则会产生少量费用
  • 与Go 1.3 GC相比,延迟更短,但很可能吞吐量也更低

在Go 1.1之上的Go 1.3垃圾收集器更新:

  • 并发扫描(导致更短的暂停时间)
  • 完全精确

前往1.1垃圾收集器:

  • 标记扫描(并行实现)
  • 非世代
  • 不紧凑的
  • 最精确(堆叠框架除外)
  • 停止世界
  • 基于位图的表示
  • 程序不分配内存时的零成本(也就是说,改组指针的速度与C一样快,尽管实际上这比C的运行慢一些,因为Go编译器不如GCC这样的C编译器先进)
  • 支持对象的终结器
  • 不支持弱引用

去1.0垃圾收集器:

  • 与Go 1.1相同,但是垃圾回收器不是很精确,而是保守的。保守的GC可以忽略诸如[] byte之类的对象。

用不同的GC替换GC是有争议的,例如:

  • 除了非常大的堆之外,尚不清楚世代GC总体上是否会更快
  • 软件包“不安全”使得难以实施完全精确的GC和压缩GC


 类似资料:
  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner

  • Go语言自带垃圾回收机制(GC)。GC 通过独立的进程执行,它会搜索不再使用的变量,并将其释放。需要注意的是,GC 在运行时会占用机器资源。 GC 是自动进行的,如果要手动进行 GC,可以使用 runtime.GC() 函数,显式的执行 GC。显式的进行 GC 只在某些特殊的情况下才有用,比如当内存资源不足时调用 runtime.GC() ,这样会立即释放一大片内存,但是会造成程序短时间的性能下降

  • 垃圾回收 我们对生产中花了很多时间来调整垃圾回收。垃圾回收的关注点与Java大致相似,尽管一些惯用的Scala代码比起惯用的Java代码会容易产生更多(短暂的)垃圾——函数式风格的副产品。Hotspot的分代垃圾收集通常使这不成问题,因为短暂的(short-lived)垃圾在大多情形下会被有效的释放掉。 在谈GC调优话题前,先看看这个Attila的报告,它阐述了我们在GC方面的一些经验。 Scal

  • 对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。 当我们不再需要某个东西时会发生什么?JavaScript 引擎如何发现它并清理它? 可达性(Reachability) JavaScript 中主要的内存管理概念是 可达性。 简而言之,“可达”值是那些以某种方式可访问或可用的值。它们一定是存储在内存中的。 这里列出固有的可达值的

  • 垃圾收集,引用计数,显式分配 和所有的现代语言一样,OCaml提供垃圾收集器,所以你不用像C/C++一样显式地分配和释放内存。 JWZ在他的文章 "Java sucks" rant(Java蛋疼(怒)!): 第一个好家伙是Java没有 free()。其他的都没有所谓了。这几乎掩盖了所有的缺点,不管有多糟糕, 这个有点让后续文档基本都没有意义了,但是...(译注:但是啥大家自己看吧) OCaml的垃

  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄