回答

收藏

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

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

Go 是一种垃圾收集语言:
" J9 R; Y" e4 {/ z0 D, Ohttp://golang.org/doc/go_faq.html#garbage_collection
1 J3 e5 A2 g% V# x1 _9 g) R这是一个标记和清除垃圾收集器,但它没有深入研究细节,并正在开发替代品……然而,自 Go 自发布以来,这一段似乎没有太多更新。' ^* n# y+ }1 u& g. U+ ~; l
它还在标记和清除吗?是保守还是准确?是一代吗?
( J2 I6 N8 x9 g0 o' T. a! w                                                               
; E5 y7 P7 n9 m* U, Q2 B% e) y7 a    解决方案:                                                               
4 w, g- H4 M' C8 a' U- n! w9 L/ d                                                                Go 1.4  垃圾收集器计划:# ~! m( b8 m" e9 L- ^; R/ k
混合停止世界/并发收集器
6 ~. g$ l: W; Zstop-the-world 部分限制在 10 毫秒的最后期限内
0 R* i0 ]) ?- @专门用于运行和发送收集器CPU 内核
& y  W' _6 ]7 d  E( H! R3 r+ U三色标记扫描算法
  r+ x! t. o4 Q- N7 r非世代
9 Z) x* `$ l2 Q8 w8 l9 o9 ~非压实
- f7 K! P* Z3 _. Y! Z完全精确
# ^; N: N$ F& X$ H如果程序到处移动指针,成本会很低
% C) o" b7 W& P- L比 Go 1.3 GC 更低的延迟,但很可能也更低的吞吐量
在 Go 1.1 之上的 Go 1.3 垃圾收集器更新:& e5 D& P9 |1 G% n
并发扫描(暂停时间较短)# D1 Z# r. g! p. ]
完全精确
Go 1.1 垃圾收集器:, x" R7 D9 d) r
mark-and-sweep(并行实现)
+ C2 [" N; m3 j0 T0 S! U非世代9 A# h4 }- j1 f2 b; n
非压实  ^  I5 |* g4 x$ ?$ C
大部分精度(堆栈帧除外), |) ?8 F- B. d( {  _
停止世界
' C  ?9 e+ n' o: G3 \1 i基于位图的表示, i# u& Z# H1 m
当程序不分配内存时,零成本C 一样快,虽然实际上比 快C 运行缓慢,因为 Go 编译器不如 GCC 等 C 先进的编译器)6 [6 K! I6 q9 h* [; q# M
支持对象的终结器
) Y$ w6 C1 a3 M' E  O不支持弱引用
Go 1.0 垃圾收集器:
7 m3 W/ [7 O" a+ `# r  l2 R与 Go 1.1 是一样的,但垃圾收集器不是最准确的,而是保守的。GC 可以忽略 []byte 等物体。用不同的 GC 替换 GC 有争议,例如:! o3 b# o: M! H0 x# Q# Z& R6 I: M1 S
除了很大的堆,分代 还不清楚GC 总的来说会更快吗?8 n/ W  S7 \- F7 d) |3 d
包不安全使得很难实现完全准确的 GC 和压缩 GC
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则