Как узнать о приближении OutOfMemoryException ?
От: Nikolay_P_I  
Дата: 29.01.14 07:21
Оценка:
Есть C# .NET библиотека. Получает буфер данных, извлекает из него кучку мелких буферов, согласно протоколу передачи. Иногда на вход приходит мусор, в результате чего нарезается много крупных буферов и выдается OutOfMemoryException. В этом случае желательно до этого исключения не доводить, а выдать аварийную диагностику. Прописывать magic number на размеры и число буферов или общее кол-вол памяти, занятое процессом — не хочется. Потом может измениться хост библиотеки, его разрядность. Можно ли как автоматически понять с приемлимой точностью, что вот-вот наступит авария по памяти ?
Re: Как узнать о приближении OutOfMemoryException ?
От: Sinix  
Дата: 29.01.14 07:33
Оценка: 28 (4)
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>Есть C# .NET библиотека. Получает буфер данных, извлекает из него кучку мелких буферов, согласно протоколу передачи. Иногда на вход приходит мусор, в результате чего нарезается много крупных буферов и выдается OutOfMemoryException. В этом случае желательно до этого исключения не доводить, а выдать аварийную диагностику.

Ну так и отлавливайте мусор _до_ аллокации памяти. Придёт мусор в виде "много мелких блоков" — что, спокойно обрабатывать должно?

N_P> Прописывать magic number на размеры и число буферов или общее кол-вол памяти, занятое процессом — не хочется. Потом может измениться хост библиотеки, его разрядность. Можно ли как автоматически понять с приемлимой точностью, что вот-вот наступит авария по памяти ?


1. Завести пул больших массивов, переиспользовать.
2. Для проверки использовать MemoryFailPoint.
Re[2]: Как узнать о приближении OutOfMemoryException ?
От: Nikolay_P_I  
Дата: 29.01.14 07:48
Оценка:
Здравствуйте, Sinix, Вы писали:

N_P>>Есть C# .NET библиотека. Получает буфер данных, извлекает из него кучку мелких буферов, согласно протоколу передачи. Иногда на вход приходит мусор, в результате чего нарезается много крупных буферов и выдается OutOfMemoryException. В этом случае желательно до этого исключения не доводить, а выдать аварийную диагностику.

S>Ну так и отлавливайте мусор _до_ аллокации памяти. Придёт мусор в виде "много мелких блоков" — что, спокойно обрабатывать должно?

N_P>> Прописывать magic number на размеры и число буферов или общее кол-вол памяти, занятое процессом — не хочется. Потом может измениться хост библиотеки, его разрядность. Можно ли как автоматически понять с приемлимой точностью, что вот-вот наступит авария по памяти ?


S>1. Завести пул больших массивов, переиспользовать.

S>2. Для проверки использовать MemoryFailPoint.

Алгоритмически не вычисляется. Протокол допускает произвольную смесь больших и малых буферов. Валидность данных (размер) ограничена бизнес-логикой. Просто в случае кривого протокола получаемая смесь переходит границы. Magic number как лимиты по кол-ву буферов и их размеру помогут, это это же криво.
MemoryFailPoint попробую, спасибо.
Re[2]: Как узнать о приближении OutOfMemoryException ?
От: Tom Россия http://www.RSDN.ru
Дата: 29.01.14 11:18
Оценка:
N_P>>в результате чего нарезается много крупных буферов и выдается OutOfMemoryException
В .NET 4.5.1 оно тоже воспроизводится? Там есть компактификация LOH
Народная мудрось
всем все никому ничего(с).
Re[3]: Как узнать о приближении OutOfMemoryException ?
От: Sinix  
Дата: 29.01.14 11:41
Оценка:
Здравствуйте, Tom, Вы писали:

N_P>>>в результате чего нарезается много крупных буферов и выдается OutOfMemoryException

Tom>В .NET 4.5.1 оно тоже воспроизводится? Там есть компактификация LOH

Это не ко мне вопрос наверно, к топикстартеру

Проблема в том, что outofmemory может произойти и не по вине managed-кучи, вот тут есть пример.

Вообще, любое исполнение внешнего потока инструкций без проверки валидности — это прямой путь к DOS/повреждению данных. Даже без злого умысла, просто по глупой ошибке.
Re[4]: Как узнать о приближении OutOfMemoryException ?
От: Tom Россия http://www.RSDN.ru
Дата: 29.01.14 11:45
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Tom, Вы писали:


N_P>>>>в результате чего нарезается много крупных буферов и выдается OutOfMemoryException

Tom>>В .NET 4.5.1 оно тоже воспроизводится? Там есть компактификация LOH

S>Это не ко мне вопрос наверно, к топикстартеру

Это я ошибся отвечая


S>Проблема в том, что outofmemory может произойти и не по вине managed-кучи, вот тут есть пример.

S>Вообще, любое исполнение внешнего потока инструкций без проверки валидности — это прямой путь к DOS/повреждению данных. Даже без злого умысла, просто по глупой ошибке.

У него как я понял выделяются блоки памяти в managed коде и скорее всего вылазит стандартная проблема с фрагментацией LOH
Народная мудрось
всем все никому ничего(с).
Re[5]: Как узнать о приближении OutOfMemoryException ?
От: Nikolay_P_I  
Дата: 29.01.14 13:11
Оценка:
Здравствуйте, Tom, Вы писали:

S>>Вообще, любое исполнение внешнего потока инструкций без проверки валидности — это прямой путь к DOS/повреждению данных. Даже без злого умысла, просто по глупой ошибке.

Tom>У него как я понял выделяются блоки памяти в managed коде и скорее всего вылазит стандартная проблема с фрагментацией LOH

Там может быть и норма обработки и фрагментация LOH и банальный выход за 2ГБ на х86 процесс. Как случай ляжет. Обычное дело. Протокол позволяет, по ТЗ такого приходить не должно, филиалы заказчика тычут пальцами в друг-друга "это они виноваты", начальство требует "удовлетворить заказчика".

Нам достаточно отловить опасный момент, выдать диагностику, вывалить данные в брак. MemoryFailTest помог, большое спасибо посоветовавшему.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.