💡
原文中文,约4800字,阅读约需12分钟。
📝
内容提要
memory ballast 是一种降低 GC 频率的方法,Go 1.19 提出了 memory target 的新功能,可以通过环境变量或 debug.SetMemoryTarget() 设置 GC 触发的目标堆大小,uber 提出的 gc tuner 方案可以动态调整 GC 触发比例,仍然使用 ballast 时,可以尝试调整 GOGC 和 heapArena 的元数据来降低问题发生概率。
🎯
关键要点
-
memory ballast 是降低 GC 频率的一种方法,Go 1.19 引入了 memory target 功能。
-
memory target 可以通过环境变量或 debug.SetMemoryTarget() 设置 GC 触发的目标堆大小。
-
ballast 的实现是申请大切片并保持其存在但不访问,以降低物理内存占用。
-
在某些情况下,ballast 可能会占用物理内存,原因是 Go runtime 在创建时访问了它。
-
Go 的内存分配机制中,大于 32KB 的内存通过 mheap 分配,可能会触发清零操作。
-
建议使用 memory target 替代 ballast,以更好地控制内存使用。
-
gc tuner 是由 uber 提出的方案,可以动态调整 GC 触发比例,适用于旧版本的 golang。
-
继续使用 ballast 的用户可以尝试调整 GOGC 和 heapArena 的元数据来降低问题发生概率。
➡️