如何使Go程序使用更多的内存?推荐吗?

时间:2018-10-01 14:07:09

标签: go memory-management

我正在寻找与Java中的[DataContract] public class Response { [DataMember(Name = "AX")] public AX Ax { get; set; } } [DataContract] public class AX { [DataMember(Name = "BX")] public long Bx { get; set; } } 类似的选项,即分配Go应用程序可以利用的最大运行时内存。正在检查runtime,但不是全部检查方法。

我尝试用func SetMaxStack()设置类似的东西,(可能非常愚蠢)

-Xmx

之所以要这样做,是因为当前有足够的RAM可用,但是应用程序消耗的内存不会超过4-6%,我在这里可能是错的,但是它可能迫使GC发生了很多事情比所需的速度更快,导致性能问题。

我在做什么

从RDBMS系统获取大型数据集,对其进行处理以在excel中写出。

我正在寻找这样一个选项的另一个原因是限制将最终部署RAM的服务器上的RAM的最大使用量。

对此有任何提示将不胜感激。

1 个答案:

答案 0 :(得分:3)

当前稳定的Go(1.10)只有一个旋钮,可用于通过Go运行时执行的垃圾回收来交换内存以降低CPU使用率。 此旋钮称为GOGC,其描述为

  

GOGC变量设置初始垃圾回收目标百分比。当新分配的数据与上一个收集之后剩余的实时数据之比达到此百分比时,将触发收集。默认值为GOGC=100。设置GOGC=off将完全禁用垃圾收集器。 runtime/debug程序包的SetGCPercent函数允许在运行时更改此百分比。参见https://golang.org/pkg/runtime/debug/#SetGCPercent

因此,基本上将其设置为200可能会使正在运行的进程的Go运行时可能使用的内存量增加一倍。

已经说过,我会注意到Go运行时实际上试图根据您正在运行的程序的工作量和手头的CPU处理能力来调整其垃圾收集器的行为。 我的意思是,通常情况下,程序不消耗大量RAM并没有什么问题-如果收集器恰好足够快地清除了垃圾而又没有显着地影响性能,那么我没有理由担心:Go的GC是 运行时最激烈的微调之一, 而且实际上效果很好。

因此,您可以尝试采用其他路线:

  • 配置文件程序的内存分配。 分析配置文件并尝试找出热点 以及是否(以及如何)优化它们。

    您可以开始here 并继续与其他 intros到这个东西。

  • 优化。通常,这等于制作某些缓冲区 可在对相同函数的不同调用中重复使用 消耗它们,预先分配切片而不是生长它们 逐步使用sync.Pool(在认为有用的地方等等)。

    这些措施实际上可能会增加内存 真正使用的(即由活动对象使用) 垃圾),但可能会降低GC的压力。