它可以。
在Linux中,您可能会遇到两种不同的内存不足情况。您遇到的取决于sysctl vm.overcommit_memory
(/proc/sys/vm/overcommit_memory
)的值
简介:
内核可以执行所谓的“内存过量使用”。这是内核为程序分配的内存大于系统中实际内存的时间。这样做是希望程序不会真正使用它们分配的所有内存,因为这是很常见的情况。
overcommit_memory = 2
当overcommit_memory
设置2
为时,内核根本不执行任何过量使用。而是在为程序分配内存时,可以保证访问该内存。如果系统没有足够的可用内存来满足分配请求,则内核将仅为该请求返回失败。程序可以适当地处理这种情况。如果在分配失败时没有检查分配是否成功,则应用程序将经常遇到段错误。
对于段错误,您应该在以下输出中找到这样的行dmesg
:
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
这at 0
意味着应用程序尝试访问未初始化的指针,这可能是内存分配调用失败的结果(但这不是唯一的方法)。
overcommit_memory = 0和1
当overcommit_memory
设置为0
或时1
,启用过量使用,并且允许程序分配比实际可用更多的内存。
但是,当程序要使用已分配的内存时,内核却发现它实际上没有足够的内存来满足要求,因此需要取回一些内存。它首先尝试执行各种内存清理任务,例如刷新缓存,但是如果这还不够,它将终止进程。此终止由OOM-Killer执行。OOM-Killer会检查系统,以查看哪些程序正在使用什么内存,它们已经运行了多长时间,谁在运行它们,以及许多其他因素来确定哪个程序被杀死。
在进程被杀死之后,它正在使用的内存被释放,而刚刚导致内存不足的程序现在拥有了它所需要的内存。
但是,即使在这种模式下,仍然可以拒绝程序分配请求。当overcommit_memory
is时0
,内核将尝试最好地猜测何时开始拒绝分配请求。设置为时1
,我不确定使用什么确定来确定何时应拒绝请求,但是它可以拒绝非常大的请求。
通过查看的输出dmesg
并找到诸如以下的消息,可以查看是否涉及OOM-Killer。
[11686.043641] Out of memory: Kill process 2603 (flasherav) score 761 or sacrifice child
[11686.043647] Killed process 2603 (flasherav) total-vm:1498536kB, anon-rss:721784kB, file-rss:4228kB