Estoy trabajando en un sistema que asigna memoria caché de IO para aumentar el rendimiento. Luego, al detectar OOM, se lleva algo de vuelta, de modo que la lógica de negocios pueda continuar, incluso si eso significa menos caché de IO y un rendimiento de escritura ligeramente menor.
También trabajé con aplicaciones embebidas de Java que intentaban administrar OOM forzando la recolección de basura, liberando opcionalmente algunos objetos no críticos, como datos precargados o en caché.
Los principales problemas con el manejo OOM son:
1) ser capaz de volver a tratar en el lugar donde ocurrió o ser capaz de hacer retroceder y volver a tratar desde un punto más alto. La mayoría de los programas contemporáneos confían demasiado en el lenguaje para lanzar y no logran realmente dónde terminan y cómo volver a intentar la operación. Por lo general, se perderá el contexto de la operación, si no fue diseñado para ser preservado
2) ser capaz de liberar algo de memoria en realidad. Esto significa un tipo de administrador de recursos que sabe qué objetos son críticos y cuáles no, y el sistema puede volver a solicitar los objetos liberados cuando más tarde se vuelvan críticos
Otro tema importante es poder rodar volver sin desencadenar otra situación OOM. Esto es algo que es difícil de controlar en idiomas de nivel superior.
Además, el sistema operativo subyacente debe comportarse predecible con respecto a OOM. Linux, por ejemplo, no lo hará, si la sobrecomisión de la memoria está habilitada. Muchos sistemas habilitados para el intercambio morirán antes que reportar el OOM a la aplicación ofensiva.
Y existe el caso cuando no es su proceso el que creó la situación, por lo que liberar memoria no ayuda si el proceso ofensivo sigue produciendo una fuga.
Debido a todo esto, a menudo son los sistemas grandes e integrados que emplean estas técnicas, ya que tienen el control sobre el sistema operativo y la memoria para habilitarlos, y la disciplina/motivación para implementarlos.
Disculpa si el comentario anterior fue grosero. Pero, por ejemplo, las aplicaciones de la GUI de Java manejan bastante bien OutOfMemoryError (no soy un gran admirador de Java, solo tengo en cuenta mi experiencia): finalizado es, p. solo la solicitud se originó a partir de la acción de un solo usuario. – KarolDepka
También a veces es bueno dejar que un solo hilo muera, pero deje que el resto del programa se ejecute, lo que a veces ocurre de forma natural. – KarolDepka
También a veces se puede contener la falla para sabotear solo el manejo de eventos únicos (como en, por ejemplo, el ciclo/subproceso de envío de eventos GUI). – KarolDepka