如何停止golang gc并手动触发它?

gj3fmq9x  于 2023-02-01  发布在  Go
关注(0)|答案(2)|浏览(270)

目前我支持golang写的数据库上的大表连接,但是gc太耗时了,我想关闭go gc手动触发,如何配置go build参数?

g52tjvyc

g52tjvyc1#

runtime的软件包文档包含您需要的所有详细信息:
GOGC变量设置初始垃圾收集目标百分比。当新分配的数据与上次收集后剩余的实时数据之比达到此百分比时,将触发收集。默认值为GOGC = 100。**将GOGC设置为off将完全禁用垃圾收集器。**runtime/debug包的SetGCPercent函数允许在运行时更改此百分比。请参阅www.example.com。https://golang.org/pkg/runtime/debug/#SetGCPercent.
因此,您可以将环境变量GOGC设置为一个百分比,它是新分配的数据与上次收集后剩余的活动数据的比率。
当上述数据比率达到GOGC值时,将启动(垃圾)收集。初始设置取自GOGC env变量,如果未设置该变量,则取自100。值off将禁用垃圾收集。
在运行时,您可以通过调用debug.SetGCPercent()来更改GOGC比率,传递一个负值以禁用它:

debug.SetGCPercent(-1)

您可以使用runtime.GC() "手动"触发垃圾收集。
完全禁用GC可能不是你想要的。阅读runtime的完整包文档,在那里你可以找到关于如何微调GC和如何跟踪GC运行的细节。分析它们并采取相应的行动。
还请注意,今天发布的Go 1.7具有改进的垃圾收集器:
由于垃圾收集器的加速和标准库的优化,程序运行的速度应该会更快一些,有很多空闲goroutine的程序会比Go语言1.6中的垃圾收集暂停时间短很多。
如果还没有,那么在采取进一步行动之前,首先测试一下用Go 1.7编译的应用程序。

woobm2wo

woobm2wo2#

要以编程方式禁用GC,需要两个步骤:

  • 将GC百分比设置为负值
  • 将内存限制设置为非常高的值

这两种设施均由包"runtime/debug"提供

debug.SetGCPercent(-1)
debug.SetMemoryLimit(math.MaxInt64)

这两个函数都返回它们以前的设置,所以如果您只想暂时禁用GC,一种方法是捕获这些值,然后在您想再次启用它时将它们重置。

gcpercent := debug.SetGCPercent(-1)
memlimit := debug.SetMemoryLimit(math.MaxInt64)

{
    // ... do something ...
}

debug.SetGCPercent(gcpercent)
debug.SetMemoryLimit(memlimit)

注意,* 仅仅 * 设置GC百分比不足以停止GC,因为当您超过内存限制时,它仍然会被触发。
根据文件:
除非达到内存限制,否则负百分比将有效地禁用垃圾回收。有关详细信息,请参阅SetMemoryLimit。
SetMemoryLimit的文档说明:
Go语言运行时总是会考虑内存限制,所以要有效地禁用这种行为,需要将内存限制设置得很高。math.MaxInt64是禁用内存限制的标准值,但是如果内存值远远大于底层系统的可用内存,也可以有效地禁用内存限制。
现在,实际上你可以不设置内存限制,因为默认的初始值确实是math.MaxInt64,这实际上禁用了它。
初始设置为math.MaxInt64,除非设置了GOMEMLIMIT环境变量,在这种情况下,它将提供初始设置

相关问题