Какие операционные системы освободят утечки памяти? - PullRequest
4 голосов
/ 12 ноября 2009

У меня есть настольная программа. Большинство операционных систем запускают программу в собственном адресном пространстве.

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

В чем я не уверен, так это в том случае, если в программе есть утечка памяти, будет ли «утечка» памяти также возвращена для повторного использования или она потеряна до перезагрузки машины?

Это продолжение вопроса, который я задавал ранее сегодня: Имеют ли место небольшие утечки памяти? , и в нескольких комментариях там упоминалось, что память программы освобождается по завершении программы. Если утечки освобождаются, когда программа завершена, то на меня определенно оказывается меньшее давление, чтобы строго избавить мою программу от мельчайших утечек.

В частности, я программист Windows, и мне нужно знать, что происходит (потеря памяти или освобождение памяти) для Windows 98, 2000, XP, Vista и 7. Но я также хотел бы услышать, что происходит на Mac и Unix машины.


Уточнение: я говорю о нерастущих утечках. Это утечки постоянного размера, которые случаются один раз при запуске программы.

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

В любом случае вопрос не в том, нужно ли устранять утечки. Вопрос в том, вернут ли операционные системы утечку памяти после завершения программы.

Ответы [ 3 ]

6 голосов
/ 12 ноября 2009

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

Все современные операционные системы используют механизм, называемый виртуальной памятью, для отслеживания памяти программ.

Здесь я довольно подробно узнал о виртуальной памяти CS3231 .

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

С точки зрения приложений, он получает полный доступ к памяти (4 гигабайта в 32-битной ОС, что-то грандиозное в 64-битной) и может продолжать выделяться, пока не достигнет аппаратного предела, даже если физическая память меньше это ограничение (для этого требуется, чтобы ОС сохраняла часть содержимого памяти на диске, обычно в файле подкачки)

Этому способствует аппаратное обеспечение ЦП, модуль, обычно называемый MMU (блок управления памятью), а иногда и TLB (трансляционный буфер взгляда) для ускорения операций виртуальной памяти.

Еще одна страница , которая объясняет немного больше о защите памяти, в которой подробно описывается внутренняя работа виртуальной памяти.

2 голосов
/ 12 ноября 2009

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

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

Однако, сказав все это, есть очень реальные причины не игнорировать утечки памяти. Например, вы не знаете, как долго ваш пользователь будет запускать вашу программу. Это может быть 5 минут или 5 недель. Утечки памяти накапливаются и используют все больше и больше ресурсов, пока другие вещи не начинают выходить из строя.

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

2 голосов
/ 12 ноября 2009

Windows освободит вашу память процесса после ее завершения но утечка оказывает некоторое влияние на производительность и надежность вашего приложения (в зависимости от его размера)

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

Если вы знаете об утечках памяти, я предлагаю вам выследить их и избавиться от них, никакая часть ОС или ваш язык программирования не сделает это за вас. Есть несколько очень хороших инструментов для выявления утечек.

...