Pode.
Existem duas condições diferentes de falta de memória que você pode encontrar no Linux. O que você encontra depende do valor de sysctl vm.overcommit_memory
( /proc/sys/vm/overcommit_memory
)
Introdução:
O kernel pode executar o que é chamado de 'supercomprometimento de memória'. É quando o kernel aloca programas mais memória do que realmente está presente no sistema. Isso é feito na esperança de que os programas não usem toda a memória que eles alocaram, pois essa é uma ocorrência bastante comum.
overcommit_memory = 2
Quando overcommit_memory
está definido como 2
, o kernel não executa nenhuma confirmação excessiva. Em vez disso, quando um programa recebe memória, é garantido o acesso a essa memória. Se o sistema não tiver memória livre suficiente para satisfazer uma solicitação de alocação, o kernel retornará apenas uma falha para a solicitação. Cabe ao programa lidar normalmente com a situação. Se não verificar se a alocação foi bem-sucedida quando realmente falhou, o aplicativo geralmente encontrará um segfault.
No caso do segfault, você deve encontrar uma linha como esta na saída de dmesg
:
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
Os at 0
meios que o aplicativo tentou acessar um ponteiro não inicializado, que pode ser o resultado de uma falha na chamada de alocação de memória (mas não é a única maneira).
overcommit_memory = 0 e 1
Quando overcommit_memory
está definido como 0
ou 1
, a confirmação excessiva é ativada e os programas têm permissão para alocar mais memória do que realmente está disponível.
No entanto, quando um programa deseja usar a memória que foi alocada, mas o kernel descobre que na verdade não possui memória suficiente para satisfazê-lo, ele precisa recuperar alguma memória. Primeiro, ele tenta executar várias tarefas de limpeza de memória, como a limpeza de caches, mas se isso não for suficiente, encerrará um processo. Essa terminação é realizada pelo OOM-Killer. O OOM-Killer analisa o sistema para ver quais programas estão usando qual memória, há quanto tempo eles estão sendo executados, quem os executa e vários outros fatores para determinar qual deles é morto.
Depois que o processo é encerrado, a memória usada é liberada e o programa que acabou de causar a condição de falta de memória agora tem a memória necessária.
No entanto, mesmo nesse modo, os programas ainda podem receber pedidos de alocação negados. Quando overcommit_memory
é 0
, o kernel tenta adivinhar quando deve começar a negar solicitações de alocação. Quando está definido como 1
, não tenho certeza de qual determinação ele usa para determinar quando deve negar uma solicitação, mas pode negar solicitações muito grandes.
Você pode ver se o OOM-Killer está envolvido observando a saída de dmesg
e localizando mensagens como:
[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