Память, которая распределена по памяти и не освобождена - PullRequest
0 голосов
/ 13 ноября 2011

Я прочитал это -

Память, выделенная malloc (например) и не освобожденная использование функции free () освобождается после завершения программы. что это делается системой opearting. Итак, когда имеет или нет когда сборщик мусора входит в картину?

Или же не во всех операционных системах происходит автоматическое освобождение памяти при завершении программы?

Ответы [ 4 ]

5 голосов
/ 13 ноября 2011

Это утверждение о malloc и free верно для всех современных вычислительных операционных систем.Но утверждение в целом отражает полное недопонимание цели сборки мусора.

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

Рассмотрим сервер сообщений, который обрабатывает сто сообщений в секунду.Вы звоните malloc, когда получаете новое сообщение.И тогда вы должны сделать много вещей с этим.Возможно, вам придется войти в систему.Возможно, вам придется отправить его другим клиентам.Возможно, вам придется записать его в базу данных.Когда вы закончите, если вы этого не сделаете, через несколько дней у вас в памяти останутся миллионы сообщений.Таким образом, у вас есть для вызова free.

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

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

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

1 голос
/ 13 ноября 2011

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

0 голосов
/ 13 ноября 2011

Представьте себе длительный процесс, подобный веб-серверу, который malloc() представляет собой набор структур данных для каждого соединения, которое он обслуживает.Если в этой памяти никогда не будет free() s, использование памяти процессом будет постоянно расти, возможно, занимая все доступное в системе.

0 голосов
/ 13 ноября 2011

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

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

...