Вопрос

Воспоминания кучи - мусор, собранная на Java.

Сбор мусор также собирается?

Как восстанавливается память стека?

Нет правильного решения

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

Память в стеке содержит параметры методов и локальные переменные (точнее: ссылки для объектов и переменные для примитивных типов). Это будет автоматически удалено, если вы оставите метод. Если переменные являются ссылками (на объекты), сами объекты находятся на куче и обрабатываются коллекционером мусора.

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

А Более подробный ответ дается Томасом Порнон, посмотрите на это для получения более подробной информации.

Стек не мусор, собранная на Java.

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

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

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

То, что мы называем стеком, - это накопление метод активации контекста: Для каждого вызванного метода это концептуальная структура, которая содержит аргументы метода, локальные переменные, скрытый указатель на контекст для вызова и слот для сохранения указателя инструкции. Контекст активации недоступен как таковой из самого языка Java. Контекст становится бесполезным, когда метод выходит (с return или из -за исключения, выброшенного). Так получилось, что, когда метод вызывает метод B, гарантируется, что при восстановлении контроля контекст для B стал бесполезным. Это подразумевает, что срок службы контекста для B является подпадением времени жизни контекста для A. Таким образом, контексты активации (для данного потока) могут быть выделены с помощью дисциплины Lifo («Последнее, сначала»). Более простыми словами, стек: новый контекст активации выдвигается сверху стопки контекстов, и контекст сверху будет первым, из которого можно утилизировать.

На практике контексты активации (также называют стеки рамки) объединяются в порядке стека в выделенной области. Эта область получена из операционной системы при запуске потока, и операционная система возвращает ее обратно, когда поток заканчивается. Верхняя часть стека обозначена определенным указателем, часто содержащимся в регистрации ЦП (это зависит от того, интерпретирует ли JVM или компиляция кода). «Указатель на контекст вызывающего абонента» является виртуальным; Контекст вызывающего абонента обязательно расположен чуть ниже в порядке стека. GC не вмешивается: область для стека создана и восстанавливается синхронно, из самой активности потока. Так также работает на многих языках, таких как В, который вообще не имеет GC.

Теперь ничто не мешает реализации JVM делать иначе, например, распределяя контексты активации в куче и собрав их GC. Обычно это не делается в виртуальных машинах Java, поскольку распределение стека быстрее. Но некоторые другие языки должны делать такие вещи, особенно те, которые играют с продолжения все еще используя GC (например, Схема и это call-with-current-continuation функция), потому что такие игры нарушают правило LIFO, объясненное выше.

Часть стека памяти работает как «стек». Я знаю, это звучит плохо, но именно так это работает. Данные добавляются в верхнюю часть друг друга (pushed onto the stack) и автоматически удаляется сверху (popped off the stack), как работает ваша программа. Он не собран мусором - и это не должно быть, поскольку эта память автоматически восстанавливается после того, как данные выпадают из стека. И когда я говорю, что восстановлен, я не имею в виду, что он расплавляется - просто местоположение в памяти стека, где будут сохранены следующие данные, уменьшается, так как данные отключены.

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

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

Если вы обратитесь к памяти, используемой в стеке, это не собирается мусор.
Виртуальная машина Java использует явные инструкции ByteCode для резервирования и выпуска памяти в стеке, эти инструкции генерируются компилятором и управляют временем срока службы примитивах, таких как Int, Boolean, Double и объектные ссылки в стеке.
Были планы по реализации так называемой оптимизации хвостового вызова, которая удалила бы некоторые записи из стека, как только известно, что они больше не используются, но я не знаю ни одного JVM, который уже поддерживает это.
Так что нет, нет сбора мусора для самого стека, только компилятор сгенерировал инструкции Push и POP для управления использованием памяти.

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

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

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

Это обычно не имеет значения, если вы не используете финализмы (или, по -видимому, Referenceс). В этом случае вы должны быть осторожны и использовать замки/летучие для обеспечения соблюдения happens-before отношение.

Когда потоки останавливаются, обычно весь стек будет счищен.

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

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

Нет. Каждый поток имеет свой собственный стек и содержит:

  1. Метод конкретные значения (которые недолговечны) и
  2. Ссылки на объекты, созданные на куче, и упоминаются методом

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

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

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