2013-09-11 6 views
8

Если я объявляю int (или какой-либо примитивный тип) в методе в Java, является ли эта память освобождена в тот момент, когда функция возвращается, или она должна зависать, пока сборщик мусора не очистит его?java primitives сборщик мусора

Я знаю, что в C указатель стека сбрасывается, и это немедленно освобождает память, и я знаю, что объекты на Java должны быть собраны в мусор, но я не знаю, какой подход будет сделан с примитивами.

ответ

14

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

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

Примитивы имеют неоценимое значение и не являются указателями. Таким образом, как указано в других ответах, их GC не нужно.

Это очень аналогично malloc и free в С.

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

Когда вы создаете объект в java (предположительно с ключевым словом new), вы выделяете для него память. Тем не менее, вы никогда явно не вызываете free в java. JVM будет определять, когда необходимо выполнить освобождение.

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

13

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

+3

Это не вопрос, но как насчет примитивных полей объектов? – delnan

+3

Примитивные поля (как и все поля) будут храниться в куче с объектом. – Cruncher

8

Это то, что память освобождает момент, когда функция возвращается, или она должна зависеть до тех пор, пока сборщик мусора не очистит его?

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

Смежные вопросы