std::bad_alloc 与 OOM killed 之间的区别

问题描述 投票:0回答:1

当有压缩请求进来时,有一个C++进程进行zip压缩,需要占用大量内存。 有时进程会因为内存不足而被 OOM 终止。 此外,在某些时候,它只会抛出一个 std::bad_alloc 异常并且不会死掉。

所以我的问题是,当服务器用完总内存时,需要大量内存的进程将被 OOM 杀死,或者只会得到 std::bad_alloc 异常的条件是否有所不同?

还有,为什么一个被OOM killed的进程在重启时执行了需要相同内存量的压缩操作却成功了,而不是死掉?

c++ linux memory operating-system centos
1个回答
0
投票

首先,当系统或进程内存不足时,您不能期望任何特定的行为或结果。就后果而言,你几乎没有任何形式的保证,除了“东西会停止工作”之外的任何事情。免责声明:

一般来说,可用内存有两种限制。

操作系统可能会对每个进程可以使用的内存量施加固定的上限。例如,该限制可能是 4 GB,并且进程已达到此上限。即使整个系统可能有更多未使用的内存,进程已达到其限制,并且其分配请求失败,导致

std::bad_alloc
.

在另一种情况下,这个进程可能还没有达到它的最大内存量,但是整个系统的可用内存都用完了,这就是 OOM 杀手找到一个受害者从高轨道进行核攻击的情况。

还有,为什么一个被OOM killed的进程在重启时执行了需要相同内存量的压缩操作却成功了,而不是死掉?

仅仅因为上周我运行了我的进程并且它 OOMed 并不意味着如果今天我运行相同的进程它也会吞噬所有可用的系统内存并再次 OOMed。这是崭新的一天。将“上周”换成“昨天”,或“最后一分钟”,甚至“一秒钟前”,同样的原则仍然适用。

© www.soinside.com 2019 - 2024. All rights reserved.