В чем разница между выделением памяти и сборкой мусора, пожалуйста? - PullRequest
1 голос
/ 08 февраля 2012

Я понимаю, что «Сборка мусора» - это форма управления памятью и способ автоматического восстановления неиспользуемой памяти.

Но что такое «выделение памяти» и концептуальное отличие от «Сборки мусора»?

Ответы [ 5 ]

6 голосов
/ 08 февраля 2012

Они Полярные противоположности .Так что да, довольно большая разница.

Выделение памяти - это процесс запроса пространства памяти для хранения вещей.

Сборка мусора (или освобождение памяти) - это процесс освобождения этой памяти обратнопул доступной памяти.

Многие новые языки выполняют оба этих шага в фоновом режиме, когда переменные объявлены / инициализированы и выпадают из области видимости.

3 голосов
/ 08 февраля 2012

Распределение памяти - это процесс запроса некоторой памяти к системе, чтобы использовать ее для чего-то.

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

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

1 голос
/ 08 февраля 2012

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

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

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

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

1 голос
/ 08 февраля 2012

Пример простого псевдокода:

void myFoo()
{    
    LinkedList<int> myList = new LinkedList<int>();
    return;
}

Это запросит достаточно нового пространства в куче для хранения объекта LinkedList. Однако, когда тело функции закончено, myList исчезает, и у вас больше нет возможности узнать, где хранится этот LinkedList (адрес памяти). Следовательно, нет абсолютно никакого способа сказать системе освободить эту память и сделать ее доступной для вас позже.

Java Garbage Collector сделает это для вас автоматически, за счет некоторой производительности и небольшого недетерминизма (вы не можете точно сказать, когда будет вызываться GC).

В C++ нет собственного сборщика мусора (пока?). Но правильный способ управления памятью - использование smart_pointers (например, std::auto_ptr (устарело в C ++ 11), std::shared_ptr) и т. Д. И т. Д.

0 голосов
/ 08 февраля 2012

Распределение памяти запрашивает у компьютера некоторую память для хранения данных.Например, в C ++:

int* myInts = new int[howManyIntsIWant];

говорит компьютеру выделить мне достаточно памяти для хранения некоторого числа целых чисел.

Другой способ сделать то же самое будет:

int myInts[6];

Разница здесь в том, что во втором примере мы знаем, когда код написан и скомпилирован, сколько именно места нам нужно - это 6 * размер одного целого.Это позволяет нам делать статическое выделение памяти (которое использует память в так называемом «стеке»).

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

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

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

Итак: выделение памяти = запрос памяти для вашей программы.Сборка мусора = где сам язык программирования определяет, какая память больше не используется, и освобождает ее для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...