Вопрос

Что ты делаешь, когда malloc возвращает 0 или новое исключение?Просто остановить или попытаться пережить состояние OOM/сохранить работу пользователя?

Это было полезно?

Решение

Я бы избежал того, чтобы избежать аварии.

Старайтесь не выполнять огромную работу (и одновременно выделять огромную часть памяти). Сохраняйте данные на диске, доверяйте кэше диска ОС и как можно больше используйте IO, отображаемый в памяти, и работайте только на небольшой части данных за раз. Если большие объемы данных должны быть онлайн (обслуживаемые с низкой задержкой), то держите их в памяти на нескольких машинах, как и все крупные компании поисковых систем. Или купить SSD.

Другие советы

Большинство людей, отвечающих на этот вопрос, вероятно, никогда не работали над встроенными системами, где Malloc, возвращающий 0, является очень реальной возможностью. В системе, над которой я сейчас работаю, в общей сложности 4,25 тыс. Байтов оперативной памяти (это 4352 байт). Я выделяю 64 байта для стека, и в настоящее время имею кучу 1600 байтов. Буквально вчера я отлаживал рутину кучи, чтобы я мог следить за распределением и освобождением памяти. Прогулка кучи использует небольшой (30 байтов) статически выделенный буфер для вывода в серийный порт. Он будет отключен для версии релиза.

Поскольку это потребительский продукт, он лучше не исчерпана, как только продукт будет выпущен. Я уверен, что это будет во время разработки. В любом случае, во всем, что я могу сделать, это звучать пару раз, и вынуждает перезагрузку.

Честно говоря, во всех проектах, которые я сделал (имейте в виду, что я еще никуда не работаю), я никогда не думал, что это может произойти, и, таким образом, я полагаю, что мои программы умрут очень быстрой смертью.

Кроме того, обработка OOM требует, чтобы вы предварительно предложили ресурсы для отображения сообщения об ошибке или сохранить все, что может быть неудобным.

Я чувствую, что в наши дни память стоила меньше, чем арахис, это не то, что должно происходить часто. На рассвете защищенной памяти и раньше, может быть, это было проблемой, но сейчас? Единственные ошибки OOM, которые я когда -либо видел, были из -за ошибки кода.

Проверка кодов возврата malloc в любом случае обычно бессмысленна.

Современные операционные системы перегружают память:Они предоставляют процессам больше памяти, чем доступно на самом деле.Память, предоставляемая вашему процессу, является виртуальной, вся она отображается на одну обнуленную страницу.

Только после того, как вы запишете данные в память, для ваших процессов будет выделена физическая уникальная страница.Если это выделение окажется неудачным, ядро ​​завершит процесс (возможно, ваш!) в попытке найти память.В этот момент вы больше ничего не можете сделать.

Если вы не разрабатываете встроенные системы, системы в реальном времени или системы, которые настолько важны, что сбои могут стоить жизни или миллиарды долларов ... тогда, вероятно, финансово не стоит беспокоиться о условиях памяти.

В большинстве случаев мало что можно сделать, когда вы вышли из памяти, так как нет памяти, чтобы создавать какие -либо новые объекты или выполнять какие -либо задачи, которые могут что -то сделать. Вы должны взвесить стоимость приложения, обрабатывающего OOM по сравнению с преимуществом, которое вы получаете от этого.

Я бы всегда проверял ошибку. Если что -то возвращает условие ошибки, то это должно быть обработано вашей программой. Даже если это сообщение, в котором написано «вне памяти, нужно идти!», Это лучше, чем «нарушение доступа», «сброшено ядром» или что -то еще. Один из них - условие ошибки, с которым вы обрабатываете, другая - ошибка. И пользователь воспримет это как таковое.

Для вашего конкретного случая вы можете попытаться отказаться от операции, освобождая ресурсы, которые вы выделяете, до достижения точки отказа, сообщить об ошибке и продолжение выполнения (возможно, когда вы пытаетесь покинуть приложение, вы можете дать вариант выйти немедленно). Таким образом, пользователь может решить, что делать, или попытаться освободить память, возившись вокруг, закрывая файлы и т. Д. Будьте интерактивны, вероятно, просто нужно войти в систему ошибки и либо уйти, либо продолжить.

Лицензировано под: CC-BY-SA с атрибуция
scroll top