专栏名称: GoCN
最具规模和生命力的 Go 开发者社区
目录
相关文章推荐
今天看啥  ›  专栏  ›  GoCN

Golang GC 从原理到优化

GoCN  · 公众号  ·  · 2024-11-20 13:02
    

主要观点总结

本文讨论了Go语言中的垃圾回收(GC)和内存管理的关键点和优化手段。文章首先介绍了GC的理论和GC算法,包括标记清除、标记整理、标记复制和分代收集等。然后介绍了Go语言中的内存分配方式,包括基于空闲链表分配方式的TCMalloc算法和基于并发标记与清扫算法的三色标记法。接着讨论了GC的问题和优化的必要性,包括GC对CPU资源的占用、内存分配和GC通常占用较多CPU资源等问题。然后介绍了一些优化手段,包括sync.pool、GOGC参数设置、ballast内存控制、GCTuner、SetMemoryLimit等。此外,还介绍了其他优化方法,如大缓存(bigcache)、堆外分配和GAB(Goroutine allocation buffer)等。最后,文章提到了Go 1.20中的arena官方文档,这是一种可以由用户手动管理但能被runtime感知的内存申请方式,可以有效降低OOM风险。

关键观点总结

关键观点1: GC的理论和算法介绍

包括标记清除、标记整理、标记复制和分代收集等。

关键观点2: Go语言中的内存分配方式

包括基于空闲链表分配方式的TCMalloc算法。

关键观点3: GC的问题和优化的必要性

包括GC对CPU资源的占用、内存分配和GC通常占用较多CPU资源等问题。

关键观点4: 优化手段

包括sync.pool、GOGC参数设置、ballast内存控制、GCTuner、SetMemoryLimit等。

关键观点5: 其他优化方法

如大缓存(bigcache)、堆外分配和GAB(Goroutine allocation buffer)等的介绍。

关键观点6: Go 1.20中的arena官方文档

这是一种可以由用户手动管理但能被runtime感知的内存申请方式,可以有效降低OOM风险。


文章预览

这篇文章与笔者之前所写几篇不同,是一篇综述型的文章,将从 GC 理论、在 Golang 中的应用、以及如何去做优化,这三个角度逐次进行阐述,文章中对于一些技术点会引用到多篇文章,希望读者也都能进行阅读,这有助于更全面的了解 Golang GC。 理论 GC 和内存分配方式是强相关的两个技术,因此在分析两者的设计原理之时,要结合起来一起看。 GC 算法 标记-清除 标记-整理 标记-复制 分代收集 关于以上算法的简单介绍 内存分配方式 线性分配 线性分配(Bump Allocator)是一种高效的内存分配方法,但是有较大的局限性。当我们使用线性分配器时,只需要在内存中维护一个指向内存特定位置的指针,如果用户程序向分配器申请内存,分配器只需要检查剩余的空闲内存、返回分配的内存区域并修改指针在内存中的位置,即移动下图中的指针: 线性分配器 ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览