Ява примитивы мусора

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

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

3 ответа

Решение

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

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

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

Это очень похоже на malloc а также free в С.

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

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

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

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

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

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

Другие вопросы по тегам