go - 如何让 Go 程序使用更多内存?这是推荐的吗?
问题描述
我正在寻找类似于-Xmx
Java 的选项,即分配我的 Go 应用程序可以使用的最大运行时内存。正在检查运行时,但不完全是这样。
我尝试使用 func SetMaxStack() 设置类似的东西,(可能非常愚蠢)
debug.SetMaxStack(5000000000) // bytes
model.ExcelCreator()
我希望这样做的原因是因为目前有足够的 RAM 可用,但应用程序不会消耗超过 4-6% ,我在这里可能错了,但它可能会迫使 GC 发生得比需要的快得多导致性能问题。
我在做什么
从 RDBMS 系统获取大型数据集,处理它以在 excel 中写出。
我寻找这样一个选项的另一个原因是限制最终部署它的服务器上 RAM 的最大使用量。
对此的任何提示将不胜感激。
解决方案
当前稳定的 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 是其中之一在运行时最激烈的微调点,实际上效果很好。
因此,您可以尝试采取另一条路线:
推荐阅读
- javascript - 无法让 javascript node.js 每 1.5 秒运行一次 setTimeout
- python - 如何一直避免使用 sym.symbols
- powerbi - 如何通过共享数据集架构的管道促进模型和报告
- java - 无法让 JavaFX 分隔符用不同的颜色设置样式
- oracle - 雪花从日期数组中选择最大日期
- weblogic - weblogic中如何创建域目录?
- java - 在模拟 Keycloak 期间在目标客户端的资源上获取 403
- azure - 问:Azure 服务主体、api 到 api?
- java - 如何使用外部for循环中的值java
- android - 无法上传签名的 apk/appBundle 来播放开发帐户“完整性检查失败”