hiwa doski Ответов: 1

Разве этот объект не должен быть мусором ?


я узнал в Java, что если объект не имеет никакой ссылки на него, он будет автоматически собираться мусором, но почему объект ниже работает нормально и не имеет никакой ссылки на него, разве он не должен быть собран мусором?
public class Main {

    public static void main(String[] args) {
	new A().show();
    }
}


class A{
    void show(){
        System.out.println("Java");
    }
}


Что я уже пробовал:

я ничего не мог сделать!

Gerry Schmitz

Ваши комментарии не имеют никакого отношения к тому, что вы показываете. Вы показываете яблоко, комментируя вкус апельсинов.

hiwa doski

если сборщик мусора не связан с этим, то я не знаю, что это такое ?

Richard MacCutchan

Посмотри на свой код. Вы создаете новый объект класса A и вызываете его метод Show. Затем вы прекращаете свое заявление. Так откуда же вы знаете, что сборщик мусора никогда не вызывался?

hiwa doski

я думал, что сборщик мусора сразу же запустится и удалит его, но оказалось, что я ошибся.

Richard MacCutchan

Я снова спрашиваю: откуда вы знаете, что это не так?

hiwa doski

потому что метод был выполнен!

Richard MacCutchan

Конечно, он был выполнен, именно это и должен делать вызов метода Show.

hiwa doski

и я подумал, что если он будет собирать мусор, то его не казнят, вот почему я сказал, что он не будет собирать мусор.

Richard MacCutchan

Он не может получить мусор, собранный до тех пор, пока все ссылки не будут удалены. Когда объект создается в main (как временный объект), он имеет ссылку. Затем он вызывает метод Show, который печатает строку. По возвращении из Show в main больше нет кода, поэтому объект выходит из области видимости и вызывается его деструктор. Теперь больше нет никаких ссылок на объект, так что он может быть собран мусором. Но поскольку приложение теперь завершает работу, сборщик мусора не будет нужен.

hiwa doski

Это очень хорошее объяснение, спасибо.

1 Ответов

Рейтинг:
6

OriginalGriff

Зачем вызывать сборщик мусора при выходе из вашего приложения? Гораздо проще просто освободить всю память в виде куска, не беспокоясь о том, чтобы избавиться от каждого отдельного объекта - приложение умирает, поэтому просто отпустите всю выделенную память обратно в систему.

И помните, что сборщик мусора не запускается сразу же, когда что - то выходит из области действия-он будет ждать, пока это действительно не понадобится или система не простаивает, прежде чем он начнет проверять, можно ли что-то освободить. В вашем примере система никогда не простаивает до тех пор, пока приложение не выйдет, и к этому моменту уже слишком поздно для GC начинать работу!


hiwa doski

что вы подразумеваете под "Когда ваше приложение завершает работу"

Richard Deeming

Когда main метод заканчивается, ваше приложение завершает работу.

OriginalGriff

Трудно поверить, что кто-то может зайти так далеко, не осознавая этого, не так ли?

Richard Deeming

Должно быть, вы здесь недавно! :Д

OriginalGriff

Джонни-приходи-в последнее время, это я! :смеяться:

hiwa doski

да, я знаю, но я думал, что это произойдет раньше.

Richard Deeming

У тебя ведь осталось не так уж много времени! :)

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

И ваше приложение завершает работу почти сразу, так что в любом случае не было бы никакого смысла собирать мусор.

hiwa doski

Ладно, спасибо за объяснение.