Собирает ли сборщик мусора стековую память, кучную память или и то и другое?

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

13
задан j0k 26 June 2012 в 11:47
поделиться

8 ответов

Стек называется «стеком» именно потому, что это зона памяти, которая управляется «политикой стека», также известной как LIFO (как Last In , Первый ушел). Если бы выделение в стеке не производилось «стековым способом», оно называлось бы не стеком, а кучей.

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

5
ответ дан 1 December 2019 в 07:19
поделиться

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

сборка мусора, напротив, работает только в куче.

1
ответ дан 1 December 2019 в 07:19
поделиться

По крайней мере, в java, стек будет автоматически освобожден, когда вы покидаете этот кадр стека, поэтому нет необходимости в сборке мусора.

Я программист на Java, поэтому у меня нет этой проблемы, но на самом деле в C ++ (я слышал об этом) вы должны быть осторожны с этим, потому что вы можете размещать объекты в стеке, и вы можете оставить это фрейм стека, объект будет деактивирован, и вы больше не сможете его использовать и т. д.

0
ответ дан 1 December 2019 в 07:19
поделиться

Он собирает динамическую память. Обычно память стека собирается автоматически , когда путь выполнения достигает конца области видимости. Например: [[

void fun()
{
  int n; // reservation on the stack as part of the activation record
  ...
} // returning the stack pointer to where it was before entering the scope

]] Фактически, в таком языке, как C ++, выделенные в стеке переменные называются автоматическими переменными ".

18
ответ дан 1 December 2019 в 07:19
поделиться

Куча памяти.

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

10
ответ дан 1 December 2019 в 07:19
поделиться

Стек идет последним в первом из , поэтому нет необходимости в сборке мусора.

- исправлено - да!

2
ответ дан 1 December 2019 в 07:19
поделиться

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

Позвольте мне привести пример на C:

#include <stdlib.h>
#include <string.h>

int main(void)
{
   char *am_i_leaking;

   am_i_leaking = strdup("Now, that's subjective!");

   return 0;
}

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

Теперь давайте посмотрим на это:

char *foo(void)
{
    static char bar[1024];
    memset(bar, 0, sizeof(bar));
    snprintf(bar, sizeof(bar -1), "Do wa diddy diddy dum diddy do");

    return bar;
}

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

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

Это не означает, что игнорирование ошибок памяти - это хорошо, независимо от того, каким является хранилище.

1
ответ дан 1 December 2019 в 07:19
поделиться

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

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

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

0
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: