Linux上的虚拟内存大小

Arn*_*d G 6 c linux memory

我试图深入理解OS Linux上的虚拟内存管理.

我真的不明白操作系统如何确定进程的VM大小.

我知道32位x86操作系统可以提供高达3 GB的vm地址空间......它总是如此吗?

在我的情况下,我有大约110 MB物理内存和32位Linux,我的主进程有一个约660 MB的虚拟机地址空间.但是,物理内存中只有50 MB(我的进程的RSS),因此我的物理内存不足.其余的是免费的,几乎整个页面缓存使用.这似乎是一种正常行为.

如果我检查/ proc/my_process_PID/smap,则有几个8 MB的匿名VMA.

我实际的问题是,我需要在代码中的其它附加10 MB的malloc,但不幸的是OOM杀手杀死我的过程(外的内存)......我想有对在VM没有更多的免费可用的页面堆,不是吗?某处是否存在巨大的内存泄漏?

为什么操作系统不会扩展我的进程vm大小呢?

有关信息,vm大小是无限的:ulimit -v:无限制

Die*_*Epp 9

每个进程可以拥有3GB的虚拟内存(大约在许多32位Linux上),并继续创建占用千兆字节虚拟内存的新进程.内核中的开销很小,但虚拟内存非常便宜.您正在使用的地址空间量可能并不重要,它可能不会触发OOM杀手.

但是,您的系统只有很多RAM.当您开始在地址空间中使用页面(写入它们)时,内核将被迫查找物理RAM以将其映射到.如果没有物理RAM,内核可以从RAM中驱逐其他页面 - 将它们交换出来或丢弃它们.但如果它不能驱逐任何页面,那么它会触发OOM杀手.

耗尽地址空间将导致我的系统malloc返回NULL,而不是触发OOM杀手.

听起来你的过程只是使用了太多的RAM.RSS是不是内存量的过程中使用,它只是在物理RAM量现在.如果您的进程有内存泄漏并且不断增长,RSS最终会停止增长 - 因为对于您使用的每个新页面,内核将从您的进程中逐出一页.

尝试使用内存分析器,如Valgrind.这将帮助您理清您应该担心的内存(mallocs)以及您可以忽略的内存(共享库和其他内存映射文件).内核(和/ proc)不会给你足够的细节.