O que você faz quando malloc
retorna uma exceção 0 ou nova de lançamentos? Basta parar ou tentar sobreviver à condição de OOM / salvar o trabalho do usuário?
O que você faz quando malloc
retorna uma exceção 0 ou nova de lançamentos? Basta parar ou tentar sobreviver à condição de OOM / salvar o trabalho do usuário?
Respostas:
Eu evitaria o OOM como evitar um acidente.
Evite fazer grande parte do trabalho (e alocar grande parte da memória) de uma só vez. Mantenha os dados no disco, confie no cache do disco do SO e faça uso das E / S mapeadas na memória, tanto quanto possível, e opere apenas em uma pequena parte dos dados por vez. Se grandes quantidades de dados precisarem estar on-line (servidas com baixa latência), mantenha-as na memória em várias máquinas, como fazem todas as grandes empresas de mecanismos de pesquisa. Ou compre um SSD.
A maioria das pessoas que responde a essa pergunta provavelmente nunca trabalhou em sistemas embarcados, onde malloc retornando 0 é uma possibilidade muito real. Em um sistema em que estou trabalhando, há um total de 4,25 KB de RAM (4352 bytes). Estou alocando 64 bytes para a pilha e atualmente tenho um heap de 1600 bytes. Ontem mesmo eu estava depurando uma rotina de heap walk para poder seguir a alocação e a liberação de memória. O heap walk usa um pequeno buffer estaticamente alocado (30 bytes) para gerar saída para uma porta serial. Será desativado para a versão de lançamento.
Como este é um produto de consumo, é melhor não ficar sem memória depois que o produto for lançado. Tenho certeza que sim durante o desenvolvimento. De qualquer forma, tudo o que posso fazer é emitir um bipe no alto-falante algumas vezes e forçar uma reinicialização.
Para ser sincero, em todos os projetos que fiz (lembre-se de que ainda não estou trabalhando em nenhum lugar), nunca considerei que isso poderia acontecer e, portanto, suponho que meus programas tenham uma morte muito rápida.
Além disso, o manuseio de uma OOM exige que você aloque previamente os recursos para exibir a mensagem de erro ou salvar tudo, o que pode ser um pouco inconveniente.
Sinto que hoje em dia, a memória custa menos que o amendoim, não é algo que deve acontecer com frequência. No início da memória protegida e antes, talvez isso fosse uma preocupação, mas agora? Os únicos erros de OOM que eu já vi foram de código com erros.
A verificação dos códigos de retorno do malloc geralmente não faz sentido.
Os sistemas operacionais modernos comprometem demais a memória: eles fornecem aos processos mais memória do que realmente está disponível. A memória que seu processo recebe é virtual, mapeada para uma única página zerada.
Não é até você gravar na memória que uma página física única é alocada para seus processos. Se essa alocação falhar, o kernel encerrará um processo (talvez o seu!) Na tentativa de encontrar memória. Nesse ponto, não há mais nada que você possa fazer.
A menos que você esteja desenvolvendo sistemas embarcados, sistemas em tempo real ou sistemas que são tão críticos que falhas podem custar vidas ou bilhões de dólares ... Então provavelmente não vale a pena financeiramente se preocupar com as condições de falta de memória.
Na maioria dos casos, há pouco que pode ser feito quando a memória está esgotada, pois não há memória para criar novos objetos ou executar tarefas que possam fazer alguma coisa. Você precisa pesar o custo do aplicativo para lidar com o OOM versus o benefício que obtém ao fazê-lo.
Eu sempre procurava por erros. Se algo retornar uma condição de erro, ele deverá ser tratado pelo seu programa. Mesmo que seja uma mensagem que diz "Memória insuficiente, é preciso ir!", É melhor que "Violação de acesso", "núcleo despejado" ou qualquer outra coisa. Uma é uma condição de erro que você lida, a outra é um bug. E o usuário perceberá isso como tal também.
Para o seu caso específico, você pode tentar reverter a operação, liberando os recursos alocados até atingir o ponto de falha, relatando o erro e continuando a execução (talvez quando estiver tentando sair do aplicativo, você pode fornecer opção para sair imediatamente). Dessa forma, o usuário pode decidir o que fazer ou tentar liberar alguma memória, mexendo, fechando arquivos etc. É claro que a maneira como você pode lidar com a situação depende muito do seu programa - um programa que não deve ser interativo provavelmente só precisa registrar o erro e sair ou continuar.