Определяя объект Java внутри цикла, нужно ли использовать null для освобождения памяти? - PullRequest
1 голос
/ 30 января 2012

Если у меня есть цикл и я создаю новый объект внутри него

for ( int i ; i < 10 ; i++)
{
  MyObject obj = new MuObject();
   obj.use();
}

Нужно ли говорить obj = null внутри цикла в начале или конце, чтобы освободить память, используемую этим объектом, илис помощью «нового» этот объект будет отправлен в GC?и могу ли я увидеть это с точки зрения использования памяти?

обновление: поэтому, если у меня большой объект и длинный цикл, я должен присвоить объекту ноль или нет?

Ответы [ 4 ]

5 голосов
/ 30 января 2012

Проверьте это: http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html

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

EDIT:
Если вы хотите увидеть использование памяти, вы можете профилировать свое приложение, используя IDE с такой функцией. Например, NetBeans имеет приятный интерфейс, который показывает использование оперативной памяти для выделения объектов.

РЕДАКТИРОВАТЬ 2:
«поэтому, если у меня большой объект и длинный цикл, я должен присвоить объекту ноль или нет?»
Нет, вам не нужно это делать. Когда одна итерация цикла завершена, нет активных ссылок на объекты, созданные в этой итерации, поэтому не имеет значения, что у вас длинный или короткий цикл.

1 голос
/ 30 января 2012

Нет, вам не нужно устанавливать для obj значение null.Когда он будет переназначен следующей итерацией цикла, предыдущая ссылка будет мусором (если что-то еще не указывает на это) и может быть очищена.В этом смысл автоматической сборки мусора.

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

1 голос
/ 30 января 2012

Нужно ли говорить obj = null внутри цикла в начале или конце, чтобы освободить память, используемую этим объектом, или с помощью «new» этот объект будет отправлен в GC?

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

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

Я бы посоветовал взглянуть на VisualVM, в том числе и с вашим JDK.Он имеет вид памяти и вид сборщика мусора через плагин.

Обратите внимание, что нельзя полагаться на счетчик «используемой» операционной системы - куча Java редко сжимается, особенно если нет каких-либо крупныхколлекции.

0 голосов
/ 30 января 2012

Как и в случае, если вы позвоните в ГК, он не сделает это немедленно, но для хорошей практики вы можете это сделать. Для управления памятью вы можете ознакомиться с такими функциями IDE, как netbeans, Eclipse и т. Д.

...