Pode.
Existem 2 condições diferentes 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 a que está realmente presente no sistema. Isso é feito na esperança de que os programas não usem realmente toda a memória que alocaram, já que é uma ocorrência bastante comum.
overcommit_memory = 2
Quando overcommit_memory
é definido como 2
, o kernel não executa nenhuma supercompra. 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 um pedido de alocação, o kernel apenas retornará uma falha para o pedido. Cabe ao programa lidar com a situação. Se não verificar que a alocação foi bem-sucedida quando realmente falhou, o aplicativo frequentemente encontrará um segfault.
No caso do segfault, você deve encontrar uma linha como essa na saída de dmesg
:
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
O at 0
significa que o aplicativo tentou acessar um ponteiro não inicializado, que pode ser o resultado de uma chamada de alocação de memória com falha (mas não é a única maneira).
overcommit_memory = 0 e 1
Quando overcommit_memory
é definido como 0
ou 1
, a supercomprometimento é ativada e os programas podem alocar mais memória do que realmente disponível.
No entanto, quando um programa quer usar a memória que foi alocada, mas o kernel descobre que ele não tem memória suficiente para satisfazê-lo, ele precisa recuperar alguma memória.
Ele primeiro tenta executar várias tarefas de limpeza de memória, como liberar caches, mas se isso não for suficiente, terminará um processo. Essa rescisão é realizada pelo OOM-Killer. O OOM-Killer olha para o sistema para ver quais programas estão usando qual memória, por quanto tempo eles estão rodando, quem os está executando, e uma série de outros fatores para determinar qual deles será morto.
Após o processo ser eliminado, a memória que estava sendo utilizada é liberada, e o programa que acabou de causar a condição de falta de memória agora possui a memória necessária.
No entanto, mesmo nesse modo, os programas ainda podem receber solicitações de alocação negadas. Quando overcommit_memory
é 0
, o kernel tenta adivinhar quando deve começar a negar solicitações de alocação. Quando é 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 olhando a saída de demsg
e encontrando uma mensagem 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