问题标签 [memory-overcommitment]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
829 浏览

linux - 如何减少 gccgo 编译的可执行文件所需的虚拟内存?

当我使用 gccgo 编译这个简单的 hello world 示例时,生成的可执行文件使用了超过 800 MiB 的 VmData。我想知道为什么,如果我能做些什么来降低它。睡眠只是为了给我时间观察内存使用情况。

来源:

我用来编译的脚本:

gccgo的版本:

/proc/<pid>/status 的输出:

我问是因为我的设备只有 512 MiB 的 RAM。我知道这是虚拟内存,但我想尽可能减少或删除过度使用。对我来说,一个简单的可执行文件需要这么多分配似乎是不合理的。

0 投票
1 回答
61 浏览

c++ - 反初始化内存区域

在过去的几天里,我了解到内存过度使用的问题(当内存过度使用被激活时,这通常是默认设置),这基本上意味着:

操作系统为您提供 100 个从进程的(虚拟)地址空间中获取的连续(虚拟)地址,其总范围由操作系统定义。由于该内存区域尚未初始化,因此从系统范围的角度来看,它不算被占用的存储空间,因此除了消耗您的虚拟地址之外,它是一个纯粹的抽象。

它使用前 5 个字节,因此从操作系统的角度来看,您的进程现在占用了 5 个额外字节,因此系统的可用存储空间减少了 5 个字节。您还有 95 字节的未初始化存储空间。

只有当每个进程的合并占用存储(初始化)超出操作系统可以容纳的容量时,系统才会崩溃或开始杀死进程。

如果我在这方面的理解是正确的,有没有办法在你完成后“反”初始化一个内存区域,以增加系统范围的可用空间,而不会丢失malloc或请求的地址区域aligned_malloc(所以你不会随着时间的推移增加碎片)?

这个问题的目的是理论上的而不是实际的,而不是实际上“释放内存”,而是在保留已分配的虚拟地址的同时释放内存。

请求虚拟地址和占用存储的区别来源:https ://www.win.tue.nl/~aeb/linux/lk/lk-9.html#ss9.6

PD:知道 Linux 可以满足我的好奇心,我很好。

0 投票
1 回答
122 浏览

c++ - C++ 内存过量使用 Linux

我目前正在编写一个基本上为客户端处理工作负载的服务器应用程序。根据实际工作量,服务器可能会使用大量内存。目标平台是 Windows 和 Linux,代码是用 c++ 编写的。

但是,我对 linux 编程不是很熟悉,在今天的一些测试中,我遇到了一些奇怪的崩溃。事实证明,这些与过度使用的内存有关。

我编写的代码相当健壮,可以通过在遇到 bad_alloc 异常时拆分和排队其工作负载来处理内存不足的情况(至少在 Windows 系统上)。重构所有代码以应对由于过度使用的内存而可能发生的错误将是一场彻头彻尾的噩梦。

所以,我想知道是否可以关闭我的进程和子线程的过度使用。我已经在这里找到了一个老问题Link (at stackoverflow) 回答为否,但意识到这是一个 10 年前的答案,我想知道这是否会改变?

如果仍然无法明智地转向应用程序,是否至少有一种方法可以在我的应用程序中检测它的当前设置?

提前致谢!

0 投票
0 回答
32 浏览

c++ - overcommit_memory=1 时无法分配内存

我将 /proc/sys/vm/overcommit_memory 设置为 1,我认为这将允许任意数量的内存过度使用,最高可达 64 位指针允许的范围。但是,当我的内存请求变得足够大(大约 86Tb)时,mmap 调用开始失败。这是我达到的实际上限吗?如果是,那是什么?还是我在分配内存时犯了一些错误?

下面的代码在我的笔记本电脑上重现了该问题,可能需要在其他计算机上调整内存阈值。

控制台输出

这是 prlimit 的输出: