Почему система Android всегда вызывает Garbage Collector каждый раз, когда я делаю запрос к веб-серверу? - PullRequest
0 голосов
/ 08 марта 2012

Почему система Android всегда вызывает сборку мусора каждый раз, когда я обращаюсь к веб-серверу за изображениями?Хотя я делал все действия асинхронные.Слишком частый вызов GC приводит к задержке моего приложения при прокрутке или переключении.

Обновление: Я полагаю, система Android всегда вызывает GC, когда вы что-то запрашиваете веб-сервер.Вот журнал при использовании браузера Android по умолчанию.Каждый раз, когда вы нажимаете на ссылку, GC будет вызываться автоматически.

03-08 16:36:19.530: D/dalvikvm(341): GC_FOR_ALLOC freed 2124K, 31% free 10780K/15623K, paused 49ms
03-08 16:36:19.590: D/dalvikvm(341): GC_FOR_ALLOC freed 0K, 20% free 12635K/15623K, paused 49ms
03-08 16:36:19.700: D/dalvikvm(341): GC_CONCURRENT freed 1K, 20% free 12635K/15623K, paused 3ms+4ms
03-08 16:36:22.610: D/dalvikvm(20845): GC_CONCURRENT freed 735K, 10% free 9018K/9991K, paused 2ms+6ms
03-08 16:36:25.620: D/dalvikvm(20845): GC_CONCURRENT freed 1046K, 12% free 8954K/10119K, paused 4ms+3ms
03-08 16:36:27.880: D/dalvikvm(2781): GC_EXPLICIT freed 263K, 7% free 6373K/6791K, paused 2ms+2ms
03-08 16:36:28.950: D/dalvikvm(20845): GC_CONCURRENT freed 884K, 12% free 8946K/10119K, paused 3ms+3ms
03-08 16:36:29.760: D/dalvikvm(20845): GC_CONCURRENT freed 861K, 12% free 8949K/10119K, paused 3ms+3ms
03-08 16:36:31.390: D/dalvikvm(285): GC_EXPLICIT freed 1275K, 38% free 20843K/33223K, paused 17ms+8ms
03-08 16:36:31.510: D/dalvikvm(20845): GC_CONCURRENT freed 810K, 12% free 8946K/10119K, paused 3ms+5ms
03-08 16:36:38.100: D/dalvikvm(20845): GC_CONCURRENT freed 730K, 11% free 9027K/10119K, paused 3ms+6ms
03-08 16:36:40.920: D/dalvikvm(20845): GC_CONCURRENT freed 864K, 12% free 8989K/10119K, paused 2ms+5ms
03-08 16:36:45.780: D/dalvikvm(20845): GC_FOR_ALLOC freed 620K, 12% free 8909K/10119K, paused 41ms
03-08 16:36:48.250: D/dalvikvm(20845): GC_FOR_ALLOC freed 499K, 12% free 9002K/10119K, paused 45ms
03-08 16:36:48.570: D/dalvikvm(20845): GC_FOR_ALLOC freed 225K, 13% free 8899K/10119K, paused 28ms
03-08 16:36:50.670: D/dalvikvm(20845): GC_FOR_ALLOC freed 388K, 12% free 8915K/10119K, paused 34ms
03-08 16:36:52.550: D/dalvikvm(20845): GC_FOR_ALLOC freed 511K, 11% free 9008K/10119K, paused 44ms
03-08 16:36:53.780: D/dalvikvm(20845): GC_FOR_ALLOC freed 273K, 12% free 8909K/10119K, paused 42ms
03-08 16:37:05.070: D/dalvikvm(569): GC_EXPLICIT freed 376K, 12% free 6207K/6983K, paused 2ms+2ms
03-08 16:37:25.550: D/dalvikvm(2549): GC_CONCURRENT freed 337K, 9% free 7198K/7879K, paused 2ms+3ms
03-08 16:37:31.330: D/dalvikvm(2549): GC_EXPLICIT freed 54K, 10% free 7143K/7879K, paused 7ms+2ms
03-08 16:38:45.630: D/dalvikvm(2549): GC_EXPLICIT freed 268K, 10% free 7161K/7879K, paused 7ms+2ms

1 Ответ

2 голосов
/ 15 августа 2013

Android GC является автоматическим, непрозрачным, недетерминированным.Это означает, что вы ничего не можете с этим поделать .

Традиционно этот тип GC работает следующим образом.

  • Подождите, пока не будет сгенерировано достаточно мусора.
  • Если движок GC считает, что пришло время, он останавливает ваше приложение.
  • Очистите мусор
  • Возобновите ваше приложение.

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

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

Практически, нет гарантированного способа избежать задержки GC в типичных системах GC.

...