我正在开发基于 ARM 的嵌入式平台。32 位,512MB RAM,无交换。Linux 3.10.53(某些种类的 Ubuntu,如果相关的话)。
我正在处理的一些代码一直被 oom 杀死,尽管我实际测量的所有内容都表明它死后有足够的内存可用。这可能是什么原因造成的?
在运行进程之前, free -m 报告了大约 320MB free,这也接近 /proc/meminfo 中的 LowFree 数字;来自 ps -e -o vsize 的所有数字的总和约为 212MB,/proc/meminfo 中的平板数字约为 10MB,这表明不应使用超过约 222MB,这与空闲内存。
然后我运行我的代码,一段时间后它被 oom 杀死了。dmesg 中的注释说该进程的总大小为 180MB;请注意,这远小于运行它之前应该免费的 300MB 左右。正是这个进程自己的内存请求触发了 oom-killer。
(这绝对是杀死进程的 oom-killer;它在 dmesg 中说了这么多,而我的 ulimits 是无限的。)
一个简单的程序
我发现我可以使用绝对微不足道的程序重现我不理解的关键内容。我将描述它,然后(以防有人关心)返回到最初发送给我的更复杂的程序,我已经对其进行了更广泛的测试。
所以,这里有一些代码。无聊的#includes 省略。普通的 C.
int main(void) {
int i=0, j;
char * p;
while (1) {
fprintf(stderr, "allocating block %d\n", ++i);
p = malloc(10000000);
for (j=0; j<10000000; ++j) p[j] = j; …
Run Code Online (Sandbox Code Playgroud)