Je travaille sur un système qui alloue de la mémoire pour le cache IO afin d'augmenter les performances. Puis, lorsqu'il détecte un OOM, il en reprend une partie, afin que la logique de l'entreprise puisse se poursuivre, même si cela signifie moins de cache IO et des performances d'écriture légèrement inférieures.
J'ai également travaillé avec une application Java intégrée qui tentait de gérer les OOM en forçant la collecte des déchets, en libérant éventuellement certains objets non critiques, comme les données prélevées ou mises en cache.
Les principaux problèmes liés au traitement des OOM sont les suivants :
1) être capable de réessayer à l'endroit où cela s'est produit ou être capable de revenir en arrière et de réessayer depuis un point plus élevé. La plupart des programmes contemporains s'appuient trop sur le langage pour lancer et ne gèrent pas vraiment l'endroit où ils se retrouvent et la manière de réessayer l'opération. En général, le contexte de l'opération est perdu, s'il n'a pas été conçu pour être préservé.
2) être capable de libérer de la mémoire. Cela signifie qu'il faut une sorte de gestionnaire de ressources qui sache quels objets sont critiques et lesquels ne le sont pas, et que le système soit capable de redemander les objets libérés lorsqu'ils deviennent critiques par la suite.
Une autre question importante est de pouvoir revenir en arrière sans déclencher une nouvelle situation d'erreur. Il s'agit d'un aspect difficile à maîtriser dans les langages de niveau supérieur.
En outre, le système d'exploitation sous-jacent doit se comporter de manière prévisible en ce qui concerne les OOM. Linux, par exemple, ne le fera pas si le surcommit de mémoire est activé. De nombreux systèmes compatibles avec l'échange mourront plus tôt que de signaler l'OOM à l'application incriminée.
Et, il y a le cas où ce n'est pas votre processus qui a créé la situation, alors libérer de la mémoire ne sert à rien si le processus fautif continue à fuir.
Pour toutes ces raisons, ce sont souvent les gros systèmes et les systèmes intégrés qui emploient ces techniques, car ils ont le contrôle du système d'exploitation et de la mémoire pour les permettre, et la discipline/motivation pour les mettre en œuvre.
0 votes
Désolé si le commentaire ci-dessus était grossier. Mais, par exemple, les applications Java GUI gèrent assez bien l'erreur OutOfMemoryError (je ne suis pas un grand fan de Java, je ne fais que noter mon expérience) - il s'agit par exemple de la seule demande provenant d'une action unique de l'utilisateur.
0 votes
De même, il est parfois bon de laisser mourir un seul thread mais de laisser le reste du programme fonctionner - cela se produit parfois naturellement.
0 votes
De plus, la défaillance peut parfois être contenue dans le sabotage du traitement d'un seul événement (comme dans la boucle/thread de distribution d'événements d'une interface graphique).
0 votes
Voici discussion ultérieure par Walter Bright pourquoi l'OOM n'est pas récupérable