知识卡片
Go不压缩对象
内容
(书中 Go 1.14)压缩式 GC(如标记-压缩、半空间复制)能消除内存碎片、加快分配,但需要在对象被移动后更新所有引用它的指针,实现复杂且不利于并发;Go 使用 TCMalloc 式的分级分配器已较好地缓解了碎片问题,且设计初期时间紧迫,团队放弃了更复杂的压缩算法转而采用三色标记。稳定地址换来了实现的简单性,代价是要靠分配器分级和清扫复用来管理碎片,而非移动对象消除碎片。
参考来源
- 位置:《Go语言底层原理剖析》第19章《垃圾回收初探》19.3.1节《为什么不选择压缩GC?》
- 结论依据:原文明确"压缩算法的主要优势是减少碎片并且快速分配。Go语言使用了现代内存分配算法TCmalloc,虽然没有压缩算法那样极致,但它已经很好地解决了内存碎片的问题。并且,由于需要加锁,压缩算法并不适合在并发程序中使用。另外,在Go语言设计初期,由于时间紧迫,设计团队放弃了考虑更加复杂的压缩算法,转而使用了更简单的三色标记算法",因此可以推出"Go 放弃压缩式 GC、用分级分配器缓解碎片"的结论。
- 原始内容:压缩算法的主要优势是减少碎片并且快速分配。Go语言使用了现代内存分配算法TCmalloc,虽然没有压缩算法那样极致,但它已经很好地解决了内存碎片的问题。并且,由于需要加锁,压缩算法并不适合在并发程序中使用。另外,在Go语言设计初期,由于时间紧迫,设计团队放弃了考虑更加复杂的压缩算法,转而使用了更简单的三色标记算法。