Поэтому пост крайне краткий.
Развивал наш централизованный обработчик ошибок, думал, что делать с сабж, ведь при нехватке памяти поведение программы становится не предсказуемым. И родилась ИДЕЯ. Думаю, я не первый, но раньше такого решения не встречал. И так...
Что делать? Продолжать обработку ошибок, формирование протокола и т.д. - не вариант, это все может не отработать, даже так: почти наверняка не отработает. Хочется вернуть программу в рабочее состояние. А что, если высвободить не нужную память? Только где ее взять?
- Чтобы продать что-то не нужное, нужно сначала купить что-то не нужное.
Вот и решение, при старте программы выделяем небольшой, но достаточный (эмпирическая оценка) блок памяти. Мусорный, никак и ничем не используемый. В обработчике ошибок, первым делом проверяем тип ошибки, если это OutOfMemoryException (или как он называется в вашем языке), освобождаем буфер, и как минимум продолжаем обработку ошибки, возможно даже и восстанавливаем работоспособность программы.
Хорошо бы еще, в какой-то момент, заново разместить аварийный блок, но это уже сложно формализуемо.