Как объекты-атрибуты, созданные внутри главного класса (конструктора), уничтожаются сборщиком мусора Java?

Вопрос или проблема

финал публичный класс CRMS{
    частный ArrayList<Автомобиль>автомобили;
    частный ArrayList<Арендатор>арендаторы;
    частный ArrayList<Транзакция>транзакции;
    частный int carid;
    частный int renterid;
    публичный CRMS() {
        автомобили = новый ArrayList<Автомобиль>();
        арендаторы = новый ArrayList<Арендатор>();
        транзакции = новый ArrayList<Транзакция>();
        carid=1;
        renterid=1;
    }
публичный класс main {

    публичный статический void main(String[] args) {
        // TODO Автоматически сгенерированный метод
        System.out.println("Привет, мир от программы GOAT программиста");
        CRMS crms = новый CRMS();

В основном, я запутался в том, как массив автомобилей и массив арендаторов будут уничтожены, когда CRMS crms будет уничтожен сборщиком мусора. Предполагая, что в основном коде ничего нет.

Я ожидал, что объектные массивы/списки атрибутов будут уничтожены при уничтожении объекта crms. Однако мой TA (Ассистент преподавателя) сказал мне, что это не так. P.S. Может кто-нибудь также сказать, является ли такой способ создания списков объектов внутри конструктора составом или агрегацией.

Когда вы выполняете CRMS crms = новый CRMS(), происходит две вещи:

  1. Выделение памяти в куче: Создается новый блок памяти в куче для хранения фактического CRMS объекта.
  2. Ссылочная переменная в стеке: На стеке создается переменная с именем crms. Эта переменная действует как ссылка, храня адрес объекта CRMS в куче.

Думайте о куче как о зоне хранения, а о стеке как о наборе заметок, ссылающихся на предметы в этом хранилище.

Концептуально, ниже вы можете представить себе расположение памяти.
КАК РАСПОЛОЖЕНА ПАМЯТЬ

После завершения main():

Когда метод main() завершит выполнение, ссылочная переменная crms на стеке будет удалена. Это не означает, что объект CRMS сам по себе исчезает.

Концептуально, вы можете представить это следующим образом:

После выполнения

Сборщик мусора:

Java имеет встроенный механизм, называемый сборщиком мусора. Он периодически просматривает кучу, чтобы найти объекты, на которые больше нет ссылок из стека (например, переменная crms после завершения main()). Эти объекты затем очищаются, освобождая память для новых объектов.

Для более глубокого изучения сборки мусора вы можете обратиться к этому ресурсу: https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

Ответ или решение

Когда вы создаете объект класса CRMS с помощью выражения CRMS crms = new CRMS(), происходят два ключевых события:

  1. Выделение памяти в куче: создается новая область памяти в куче, где хранится реальный объект CRMS.
  2. Ссылка на стек: создается переменная с именем crms на стеке. Эта переменная ссылается на адрес объекта CRMS, который находится в куче.

Для лучшего понимания, представьте, что куча — это место хранения, а стек — это набор заметок, указывающих на предметы в этом хранилище.

После завершения main()

Когда метод main() завершает выполнение, переменная ссылки crms, находящаяся на стеке, удаляется. Это не означает, что сам объект CRMS исчезает. Если в программе не осталось других ссылок на этот объект, он становится недоступным.

Сборщик мусора

Java включает встроенный механизм под названием Сборщик мусора (Garbage Collector). Он периодически просматривает кучу, чтобы найти объекты, на которые больше нет ссылок со стека (как в случае переменной crms после завершения main()). Эти объекты помечаются для удаления, и память, занимаемая ими, освобождается.

Уничтожение объектов-атрибутов

В классе CRMS вы создаете три объекта типа ArrayListcars, renters, и transactions — в конструкторе. Эти объекты будут уничтожены сборщиком мусора, если:

  1. Объект CRMS становится недоступным (что происходит, когда main() завершается без других ссылок на crms).
  2. Как только объект CRMS удаляется, все его атрибуты, такие как cars, renters, и transactions, больше не имеют ссылок, что делает их доступными для сборщика мусора.

Каждый из этих ArrayList содержит ссылки на объекты Car, Renter, и Transaction. Если нет других ссылок на эти коллекции из других частей программы, то они также будут удалены сборщиком мусора, когда CRMS станет недоступным.

Таким образом, если CRMS уничтожается, то все объекты, находящиеся в списках cars, renters, и transactions, будут также подвержены垃圾-коллекции, если на них нет других ссылок в программе.

Композиция или агрегация

Что касается вопроса о том, является ли создание объектов списков внутри конструктора композиционным или агрегационным отношением, то в данном контексте это более похоже на композицию. Композиция предполагает, что части (в данном случае, ArrayList) не могут существовать без целого (объекта CRMS). Если экземпляр CRMS будет уничтожен, все его элементы — включая списки cars, renters, и transactions — также будут уничтожены. В агрегации части могут существовать независимо от целого, что здесь не наблюдается.

Заключение

В заключение, в Java сборщик мусора автоматически управляет уничтожением объектов, когда они больше не используются. Надеюсь, это объяснение проясняет ваши сомнения. Если у вас есть дополнительные вопросы, пожалуйста, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...