Сборка мусора в Android (сделано вручную) - PullRequest
9 голосов
/ 18 ноября 2011

У меня странные сомнения. Я знаю, что сборщик мусора имеет свои ограничения. и если распределение в противном случае это может привести к тому, что приложение отреагирует необычным образом.

Так что мой вопрос в том, является ли хорошей привычкой программирования принудительно вызывать сборщик мусора (System.gc()) в конце каждого действия?

Обновление

Каждый говорит, что вызов system.gc () вообще не полезен. Тогда я задаюсь вопросом, почему он присутствует здесь.

Обновление 2

Спасибо сообществу, чтобы помочь мне. Но, честно говоря, я узнал о реальном сборнике мусора из Бовуара по этой ссылке Оптимизация производительности Java

Ответы [ 8 ]

12 голосов
/ 18 ноября 2011

это не хорошая привычка программирования принудительно вызывать сборщик мусора (System.gc ()) в конце каждого действия

Поскольку это бесполезно, только DVM решает, когдаследует позвонить, хотя вы это называли ...

4 голосов
/ 14 мая 2012

System.gc (), который виртуальная машина иногда игнорирует прихоти, в основном полезен в двух случаях:

  1. вы поглощаете память, как будто завтра нет (обычно с растровыми изображениями).
  2. вы подозреваете утечку памяти (например, случайно удерживает старый контекст) и хотите перевести память виртуальной машины в состояние покоя, чтобы увидеть, увеличивается ли использование памяти для отладки.

При номинальных обстоятельствах его не следует использовать.

2 голосов
/ 02 декабря 2014

Я действительно думаю, что это зависит от вашей ситуации.

Поскольку куча является генеративной, GC может не избавиться от определенных больших объектов или растровых изображений при первом проходе, а его эвристика может не указывать на необходимость дополнительной сборки мусора, но есть определенно сценарии, в которых эвристика может быть неправильной и мы, как разработчики, знаем шаблон или можем предсказать использование, которое GC не может, и поэтому вызов system.gc () принесет нам пользу.

Я видел это раньше в определенных сценариях, таких как работа с листами карты или другие графически интенсивные варианты поведения, когда собственный GC в Android (даже на устройствах 3.0+) не дает правильного результата, что приводит к ошибкам нехватки памяти , Однако, добавив несколько вызовов GC, ошибки Out of Memory предотвращаются, и система продолжает обрабатывать, хотя и с более медленной скоростью (из-за сбора мусора). В графически интенсивных операциях это обычно желаемое состояние (небольшое отставание) при сбое приложения, поскольку оно не может загрузить дополнительные ресурсы в память.

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

2 голосов
/ 18 ноября 2011

звонит System.gc(), не приносит никакого вреда.но вы не можете быть уверены, что это будет полезно.потому что вы просите DVM выполнить сборку мусора, но не можете command it ... Это полностью зависит от DVM.Он вызывает, когда память заканчивается или может быть в любое время ..

1 голос
/ 19 ноября 2011

Я попытался поместить System.gc () в строку перед строками, где я создал свое растровое изображение в своем приложении для Android. Сборщик мусора высвободил несколько мегабайт в некоторых случаях и положил конец моим условиям OutOfMemoryError. Он не мешал нормальной сборке мусора ни на один бит, но заставлял мое приложение работать быстрее.

1 голос
/ 18 ноября 2011

Сессия по управлению памятью, представленная Патриком Дуброем на Google IO 2011.Стоит посмотреть, так как он обсудил распределение кучи и работу GC над этим.Вы можете посмотреть его здесь Управление памятью

1 голос
/ 18 ноября 2011

Нет;если системе требуется память, она сама вызовет GC.

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

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

0 голосов
/ 08 марта 2016

Вызов GC вручную - это плохая привычка кодирования ...

Разработчик документирует использование ОЗУ состояние:

...
GC_EXPLICIT

Явный GC, например, когда вы звоните gc () (что вам следует избегать вызова и вместо этого доверяйте ГХ запускаться при необходимости).

...

Я выделил здесь наиболее жирную и важную часть, выделенную жирным шрифтом.

...