Я працюю над системою, яка виділяє пам'ять для кешу вводу-виводу для підвищення продуктивності. Потім, виявляючи OOM, він бере частину з них назад, щоб ділова логіка могла продовжуватись, навіть якщо це означає менше кеш-пам’яті вводу-виводу та трохи нижчу продуктивність запису.
Я також працював із вбудованими додатками Java, які намагалися управляти OOM, примушуючи збирати сміття, необов'язково звільняючи деякі некритичні об'єкти, такі як попередньо отримані або кешовані дані.
Основними проблемами з обробкою OOM є:
1) можливість повторити спробу в тому місці, де це сталося, або можливість відкотитись і повторити спробу з вищої точки. Більшість сучасних програм занадто покладаються на мову, яку потрібно кинути, і насправді не визначають, куди вони потрапляють і як повторити спробу. Зазвичай контекст операції буде втрачений, якщо вона не була розроблена для збереження
2) можливість фактично звільнити деяку пам’ять. Це означає своєрідний менеджер ресурсів, який знає, які об’єкти є критичними, а які ні, і система зможе повторно запитувати звільнені об’єкти, коли і якщо вони згодом стануть критичними
Іншим важливим питанням є можливість повернення назад, не викликаючи чергової ситуації з OOM. Це те, що важко контролювати мовами вищого рівня.
Крім того, основна ОС повинна поводитися передбачувано щодо OOM. Наприклад, Linux не буде, якщо увімкнено перевиконання пам'яті. Багато систем із підтримкою свопу загинуть раніше, ніж повідомлятимуть OOM про порушення.
І є випадок, коли ситуацію створив не ваш процес, тому звільнення пам’яті не допомагає, якщо образливий процес продовжує просочуватися.
Через усе це, часто великі та вбудовані системи використовують ці методики, оскільки вони мають контроль над ОС та пам’яттю, що дозволяє їм, і дисципліна / мотивація їх реалізації.