Сборка мусора происходит, когда в вашей программе больше нет ссылок на объект, а не при создании объектов, поэтому «когда мы создаем массив массивов» ничего не происходит в отношении сборки мусора.
Двумерный массив примитивов, такой как int[][]
, состоит из одного массива объектов, содержащего ссылки на n int[]
массивов (где n — размер внешнего массива — 4 дюйма). строка 1 вашего примера). Когда вы назначаете этот двумерный массив a
, вы создаете ссылку из a
на внешний массив и, в свою очередь, на внутренние массивы примитивов, поэтому сборщик мусора не удалит ни один из этих объектов.
Во второй строке вы создаете новый int[]
, а затем присваиваете его первому индексу внешнего массива. Это присваивание (а не создание массива) приводит к тому, что int[]
, который ранее был назначен индексу 0
, становится пригодным для сборки мусора, поскольку больше нет никакого способа сослаться на него - это "мусор".
Третья строка такая же, вы создаете новый int[]
, затем назначаете его индексу, удаляя единственную ссылку на ранее указанный массив. Теперь он тоже подлежит сбору. Итак, после третьей строки есть два объекта int[]
, которые можно собрать.
Четвертая строка создает новый int[][]
, выполняя ту же работу, что и выше (один массив объектов, содержащий n массивов int[]
), затем присваивает этот массив a
, тем самым удаляя единственную ссылку на предыдущий двумерный массив. В этот момент сборщик мусора видит, что на старый массив ничего не ссылается, и очищает его. Как только это произойдет, не останется ссылок и на внутренние массивы, и сборщик мусора сможет их очистить.
После четвертой строки вы все еще можете ссылаться на этот новый массив через a
и, в свою очередь, на содержащиеся в нем массивы. Массивы, которые вы создали ранее, больше недоступны и, следовательно, в конечном итоге будут очищены сборщиком мусора. Как только сборщик мусора сможет запуститься, все, что останется в памяти, — это массив, на который ссылается a
, и внутренние массивы, на которые он, в свою очередь, ссылается.
person
dimo414
schedule
23.07.2016