2010-12-29 3 views
6

В вызове метода, если я создаю объект во время этого вызова. Когда эти объекты собираются мусором?Жизненный цикл локальных объектов Java, созданных во время вызова метода

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

ответ

6

Объекты, созданные в рамках области действия метода, имеют право на сбор мусора, когда метод закрыт - если эта ссылка не будет возвращена в качестве возвращаемого значения. В этом случае вызывающий может или не может висеть на этой ссылке и не допускать ее gc'd.

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

+0

@duffymo: Разве это не зависит от того, существует ли ссылка на вновь созданный объект после возврата функции? объект, хранящийся в коллекции, находящейся в области вызова. – Cratylus

+0

@user - В этом случае область действия объекта изменилась и не может быть затронута GC. – Jeremy

+0

«Объекты, созданные в области методов ...» для меня означает, что он не был передан пользователем. Вы правы в одном: если объект, созданный в области видимости, возвращается в качестве возвращаемого значения, то вызывающий может удерживать ссылку и не допускать ее gc'd. Я исправлю свой ответ. – duffymo

3

Это не так просто - в самом конце каждый объект создается каким-то методом.

VM/компилятор должен сделать анализ пути прохождения, чтобы определить, может ли ссылка этого объекта каким-то образом уйти - представьте себе вызов newObject.toString(). Мы с вами знаем (надеемся), что это не принесет вреда, и объект все еще не упоминается, поскольку он не свяжет себя с глобальной переменной. Но VM не знает.

В то время как современная ВМ будет проводить такой анализ и рассматривать реальные короткоживущие объекты, специально предназначенные для сбора мусора, с точки зрения «высокого уровня» они всего лишь объекты. Все остальное - сложная оптимизация низкого уровня.

И вообще, как говорит duffymo - когда именно эти объекты освобождены, это неопределенно.

1

Тот факт, что выполнение метода закончилось, и теперь объект выходит за рамки, не имеет значения.
Сбор мусора - это неявная работа системы времени выполнения, работающая в отдельном потоке параллельно с вашим кодом, реализующая конкретный алгоритм сбора мусора.
Поток коллекции мусора работает в непредсказуемое время, но очень часто, каждую секунду или около того в соответствии с java docs и когда память почти исчерпана, оценка того, какие объекты могут быть собраны в мусор, т.е. нет ссылок на них из корня указатели, например статические переменные.
Таким образом, каждый объект, доступный корневым указателем, помечен, а затем рекурсивно объекты, на которые ссылаются эти объекты и т. Д.
Это может означать сканирование всего пространства процесса. После этого все объекты, не отмеченные «пометкой» предыдущего сканирования, переходят в свободный список (это GC'd).
Это тяжелая операция, как вы можете видеть.

Выполнение этого метода завершено.

Так что факт, что вы вышли из сферы действия метода, который вы назвали, потому что он завершен, не имеет значения. Это не означает, что среда выполнения знает в этот момент, что объект сделан (поскольку GC работает параллельно).
Это не похоже на C++, что в конце метода программист будет называть delete на объекте, поскольку он не нужен. В конце метода в Java автоматически не вызывается «delete».
Поток GC в конце концов осознает, что больше нет ссылок на объект, выделенный в куче методом и CG it.
Вы можете вызвать GC в любой момент, если вы хотите по:

System.gc(); 

Но GC будет работать, рано или поздно в любом случае.
Следует отметить, что до тех пор, пока ссылка на метод указателем root не может быть GC.
Так что если в вашем методе вы создаете через new объект в куче, и вы храните ссылку в статическом контейнере или возвращаете его вызывающему, объект переживает этот метод.

+0

Сбор мусора значительно улучшился со времен Smalltalk. Никакая коммерческая модель VM не делает этого больше. Много информации может быть Google о реальных алгоритмах. – mtraut

+0

System.gc() является более или менее предположением для VM, что теперь было бы хорошей идеей запуска gc. Вы не можете полагаться на то, что это подтверждено И (даже если VM соглашается) вы можете полагаться, что после сбора мусора gc(). Это всегда асинхронно. – mtraut

+0

@ mtraut: Я тоже наклоняюсь к этому.Но javadocs, похоже, говорят иначе: «Когда управление возвращается из вызова метода (System.gc), виртуальная машина Java приложила все усилия, чтобы освободить место от всех отброшенных объектов. – Cratylus

2

Life Cycle Объект

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

Ниже приведены этапы, на которых объект Java проходит через свой жизненный цикл:

1. Класс Loading

Перед созданием объекта из класса, класс должен быть загружен в память из диск. Загрузчик класса java загружает файл класса в память.

Когда класс загружен?

  • при первом создании объекта.

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

Статические инициализаторы

Java ищет любые статические инициализаторы и инициализирует статические поля, которые являются частью класса и не являются частью конкретного экземпляра класса (объекта).

3. Создание объекта

Объект является экземпляром класса. Он создается в следующих ситуациях:

Декларация: когда вы объявляете объект, например. ClassA objA; Активация: когда новый используется для размещения нового объекта в памяти кучи, например. новый ClassA(); Инициализация: создается новый объект, например. ClassA(); 4. Использование объекта

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

5. Очистка

Это последняя фаза Java объектов, где они получают переработаны и память востребована ОС.

Что происходит при уничтожении?

Объект удален из памяти. Java отбрасывает свои внутренние ссылки на этот объект. Сбор мусора (GC), который освобождает объекты, которые больше не нужны, т. Е. Нет ссылок на этот объект. Завершение: GC дает объектам последнюю возможность для очистки любых других ресурсов путем вызова метода finalize().

если есть?

Когда объект выходит за пределы сферы действия. т. е. {... objA ...}, здесь} становится областью. в это время время выполнения Java проверяет ссылки и позволяет GC перерабатывать этот объект. , когда количество ссылок на этот объект в java-памяти времени выполнения становится равным нулю (0). , когда объект явно установлен на нуль, т.е. objA = null ;, GC вызван метод finalize() явно вызван.