Что касается памяти, что происходит с нулевой переменной в Kotlin? - PullRequest
0 голосов
/ 18 июня 2020

Когда я впервые научился программировать, мне сказали: «Когда вы объявляете переменную, вы РЕЗЕРВИРУете место в памяти для этой переменной», но если переменная допускает значение NULL в Kotlin, когда переменная преобразуется в NULL для освобождения его пространство?

Например, у меня есть переменная String, допускающая значение NULL.

var x: String? = "Some text"

Когда я устанавливаю x на null, освобождается ли пространство в памяти?

x = null

Я читал о переменных на странице Kotlin, но об этом ничего не упоминается:

Я понимаю из другого чтения , что если у меня нет ссылки на эту переменную, то G C освободит память , но у меня есть переменная со значением null.

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Переменная для объекта всегда занимает 4 байта или 8 байтов (в зависимости от того, является ли виртуальная машина 32-разрядной или 64-разрядной), независимо от того, установлено ли значение null или что-то еще. Переменная для примитива занимает столько, сколько этот примитив определен для (4 байта для чисел с плавающей запятой и целых чисел, 8 байтов для чисел типа double и long, и т. Д. c.).

Таким образом, объявление String резервирует 4 байта. Эта память освобождается, когда переменная выходит за пределы области видимости. Если он объявлен внутри функции, он выходит за пределы области видимости, когда функция возвращается. Если он объявлен как свойство с резервным полем , он выходит за пределы области видимости, когда экземпляр класса, частью которого он является, освобождается сборщиком мусора. (Обратите внимание, что свойство может вообще не иметь резервного поля, и поэтому ему не нужно резервировать пространство для каждого экземпляра для свойства.) Если оно объявлено в object или в пространстве верхнего уровня, оно никогда не будет go вне область видимости во время работы приложения.

Не путайте саму переменную с объектами, на которые она может указывать. Они будут занимать намного больше 4 байтов и, конечно же, будут различаться по размеру. Их память зарезервирована, когда они создаются и восстанавливаются сборщиком мусора, когда они больше нигде не ссылаются (поэтому, если вы установите последнюю ссылку на ojbect на null, это сделает его память освобожден).

0 голосов
/ 22 июня 2020

Здесь задействованы две отдельные концепции.

Первая - это идея переменной. Как объясняет @ Tenfour04, все объектные переменные требуют 4 или 8 байтов (32- или 64-битная JVM). Это пространство используется для хранения ссылки на объект.

Второе - это сам объект. В вашем примере вы создаете экземпляр класса String с помощью «Some text». Объект будет содержать массив char примитивов, которые являются отдельными символами в строке ('S', 'o', 'm', et c.) Когда String создается, пространство в куче будет выделено JVM.

Пока ваша переменная содержит ссылку на объект String "Some text", G C не будет предпринимать никаких действий. Когда в коде вашего приложения больше нет ссылок на объект, он получает право на сборку мусора (хотя ничто точно не определяет, когда это произойдет).

Опять же, в вашем примере, когда вы устанавливаете переменную x чтобы быть null, вы удаляете ссылку, и объект "Some text" станет подходящим для сбора.

Обычно нет необходимости явно обнулять ссылку, G C очень хорош в поиск объектов, на которые больше нет ссылок. Вместо того, чтобы использовать явное присвоение null, лучше посмотреть на область видимости переменной. Как только переменная выходит за пределы области видимости, она больше не используется, и, следовательно, ссылка, которую она имеет на объект, больше не используется. Объем может быть функцией / методом или блоком кода и т. Д. c.

...