В какой момент именно объект доступен для сборки мусора? - PullRequest
10 голосов
/ 20 января 2012

У меня проблемы с памятью в приложении, и я пытаюсь разобраться со сборкой мусора. Если у меня есть следующий код:

public void someMethod() {
   MyObject myObject = new MyObject();
   myObject.doSomething();  //last use of myObject in this scope
   doAnotherThing();
   andEvenMoreThings();
}

Итак, мой вопрос: будет ли myObject доступен для сборки мусора после myObject.doSomething(), когда последний раз использовался этот объект, или после завершения someMethod(), когда он выходит из области видимости? То есть Достаточно ли умна сборка мусора, чтобы увидеть, что хотя локальная переменная все еще находится в области видимости, она не будет использоваться остальной частью кода?

Ответы [ 6 ]

4 голосов
/ 20 января 2012

Кстати в более поздней java 6, есть тип escape-анализ , где JVM может узнать, что ваш экземпляр MyObject не покидает метод, так что он даже может полностью поместить его в стек, и выдля этого вообще не нужен GC.

4 голосов
/ 20 января 2012

Лучшее, что вы можете сделать, - это взять свой код с задержкой в ​​цикле и подключить к нему профилировщик.

Если вы используете более позднюю версию Java, то JVisualVm входит в стандартную комплектацию.

Если вы работаете в Windows и у вас установлен JAVA_HOME

% JAVA_HOME% / bin / jvisualvm

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

Надеюсь, это поможет

4 голосов
/ 20 января 2012

"Где это выходит за рамки"

public void someMethod() {
   MyObject myObject = new MyObject();
   myObject.doSomething();  //last use of myObject in this scope
   myObject = null; //Now available for gc
   doAnotherThing();
   andEvenMoreThings();
}
3 голосов
/ 14 августа 2012

Итак, мой вопрос, будет ли myObject доступен для сборки мусора после myObject.doSomething (), который является последним использованием этого объекта, или после завершения someMethod (), когда он выходит из области действия?*

Первый.

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

Область видимости невидима для GC, который видит только регистры, стеки, глобальные переменные и ссылки из блоков кучи на другие блоки кучи.Так что сфера не имеет значения.

2 голосов
/ 20 января 2012

Оптимизация кода, вероятно, заметит, где находится последнее использование из myObject, и сделает его доступным для сбора мусора там, однако технически это будет происходить до тех пор, пока переменная больше не ссылается на нее (путем присвоениячто-то еще) или выходит за рамки.

2 голосов
/ 20 января 2012

После выхода из локальной области видимости.как объект может быть повторно использован и может жить в локальной области видимости.то есть.это помечено для gc.но на самом деле не gc'ed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...