回答

收藏

Go 使用什么样的垃圾回收?

技术问答 技术问答 515 人阅读 | 0 人回复 | 2023-09-12

Go 是一种垃圾收集语言:
/ s' t# ^4 }; Ghttp://golang.org/doc/go_faq.html#garbage_collection
. A: K7 J1 e9 g, A这是一个标记和清除垃圾收集器,但它没有深入研究细节,并正在开发替代品……然而,自 Go 自发布以来,这一段似乎没有太多更新。2 }1 ]0 Q& j  S8 h1 a7 e) J
它还在标记和清除吗?是保守还是准确?是一代吗?
3 _5 N/ y8 o3 O                                                                - M: A# M( {* L, g1 W# O8 b+ Y
    解决方案:                                                               
8 e5 C; [) w0 n1 B                                                                Go 1.4  垃圾收集器计划:+ x& H+ [5 h; P/ v, [- J8 x, e! s
混合停止世界/并发收集器. @/ v6 C, D/ W/ Q7 G6 W; W6 `
stop-the-world 部分限制在 10 毫秒的最后期限内, ?7 [3 L/ ?  {! T( m2 @3 B1 I) V
专门用于运行和发送收集器CPU 内核
) Z% ^3 l$ p% x' P# b三色标记扫描算法
8 v1 N5 `$ a+ I# G+ _2 W) J非世代: f$ B& h  ~9 R) b: }. `- v! Q
非压实. b+ `' P3 z$ V6 G  S- K* |
完全精确; ]# ~# U* E- R" A& f
如果程序到处移动指针,成本会很低, a5 j3 T" w: V# e0 ]2 F1 _" M
比 Go 1.3 GC 更低的延迟,但很可能也更低的吞吐量
在 Go 1.1 之上的 Go 1.3 垃圾收集器更新:
3 j* K/ c2 {2 _$ B# I并发扫描(暂停时间较短)
4 Z+ j* T3 k5 @4 A, P完全精确
Go 1.1 垃圾收集器:
$ e/ ?1 p8 Y6 O! c! omark-and-sweep(并行实现)
9 q+ t8 D7 ^' R# b( u! V5 W$ X3 Z) }非世代2 {1 C( d" ?- k6 a9 Y  U3 K/ _
非压实* a4 K4 X& a: c- \5 ~4 I
大部分精度(堆栈帧除外)
4 T% S8 b# j6 @( c停止世界  x4 e3 F. Q! Q3 b
基于位图的表示  V$ r2 h% [- Z' b. v
当程序不分配内存时,零成本C 一样快,虽然实际上比 快C 运行缓慢,因为 Go 编译器不如 GCC 等 C 先进的编译器)
2 u+ w# M' a  O& j! ^" v' |支持对象的终结器
' h8 K' a- g" O/ ^' K. v不支持弱引用
Go 1.0 垃圾收集器:7 }3 C, s/ N4 a2 q9 o' e9 X# `$ q  q
与 Go 1.1 是一样的,但垃圾收集器不是最准确的,而是保守的。GC 可以忽略 []byte 等物体。用不同的 GC 替换 GC 有争议,例如:
2 |, r% J! H5 o- _7 e- t除了很大的堆,分代 还不清楚GC 总的来说会更快吗?
( M7 D" o) E$ x6 }% P" B: w包不安全使得很难实现完全准确的 GC 和压缩 GC
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则