2 回答
TA贡献1848条经验 获得超2个赞
“它有很高的内存占用”只是他们的程序使用大量 RAM 的另一种说法。它与垃圾收集有关,因为 GC 的程序仅定期释放内存(因为每个 GC 周期都需要 CPU 时间),而手动内存管理往往会在内存未使用时或多或少地释放内存。
手动内存管理的缺点是错误可能导致崩溃和安全漏洞(如在 C++ 中,在内存被重用于其他用途后,您可能会意外地使用释放的变量),或者您必须努力表达确切的生命周期代码中的每个变量、引用等,以便编译器可以检查它们是否以有效方式使用(如在 Rust 中,您与借用检查器交互以根除代码中可能不正确使用的内存)。
连线故事中的句子听起来像是“内存足迹”是一个简单的可测量数量,您可以分配给任何语言(并且您的问题将这个想法推向了合乎逻辑的结论)。事情没那么简单。在不同的语言中,做不同的事情在内存、性能等方面有不同的成本,你必须了解语言/运行时的细节才能知道语言将如何与给定类型的程序一起工作。
例如,CPython 有引用计数,它可以更快地释放未使用的内存,但代价是必须存储和更新引用计数。一方面,Java 具有诸如对象标头之类的东西,它为每个对象增加了一定数量的内存开销,但使用了一些技巧来加速垃圾收集(如分代收集),而 Go(目前)还没有。或者在 Go 中,您可能会尝试通过使用空闲池回收内存并调整 GOGC 以更频繁地释放未使用的内存来减少程序的内存占用,如 kostya 所说。
更重要的不是我列出的那些具体细节非常重要,而是除了“更高的内存占用”或“更低的内存占用”之外,还有很多细节需要考虑。
所以:“内存占用”是指具有特定工作负载的特定程序占用的 RAM 量。从更大的角度来看,这是像您或我或 Dropbox 团队这样的人必须进行的大量权衡中的一个因素。
TA贡献1876条经验 获得超6个赞
垃圾收集器需要可用内存才能有效工作。默认情况下,Go 应用程序需要的内存大约是实时数据集大小(应用程序对象占用的内存)的两倍。
这可以使用GOGC
环境变量进行调整。通过将其设置为较低的值,应用程序将从操作系统请求更少的内存,但 GC 将更频繁地运行,因此将使用更多的 CPU 资源。通过将其设置为更高的值,GC 运行的频率将降低并使用更少的资源,但应用程序将具有更高的“内存占用”。
这是一般的想法,但确切的内存、性能要求和 GOGC 效果是高度特定于应用程序的。
- 2 回答
- 0 关注
- 341 浏览
添加回答
举报