Когда метод возвращается, переменные в его стеке всегда освобождаются (конечно, по освобождению я имею в виду, что кадр стека уничтожается, и поэтому вся память привязана к нему, как локальные переменные).
Однако, если эта переменная является объектом, то ее значение является указателем. Фактическая память, содержащая объект (который может иметь указатели на другие объекты), будет находиться в куче. Когда ссылка на стек освобождается, объект просто сидит без привязки к нему (если вы не укажете ссылку где-нибудь еще). То есть, когда java может входить и собирать мусор. То есть объект получает флаг для коллекции, и в следующий раз, когда сборщик выполнит его, он очистит этот объект.
Примитивы имеют неоценимое значение и не являются указателями. Таким образом, как указано в других ответах, их GC не нужно.
Это очень аналогично malloc
и free
в С.
Когда вы таНос некоторую память в переменной в C и ваших функция возвращает память для этого указателя освобождается, но не память она указывала к.
Когда вы создаете объект в java (предположительно с ключевым словом new
), вы выделяете для него память. Тем не менее, вы никогда явно не вызываете free
в java. JVM будет определять, когда необходимо выполнить освобождение.
Вы можете установить ссылки на нуль, чтобы сообщить JVM, что он вам больше не нужен, но часто лучше использовать минимальную область видимости.
Это не вопрос, но как насчет примитивных полей объектов? – delnan
Примитивные поля (как и все поля) будут храниться в куче с объектом. – Cruncher