Подождите, пока параллельный GC заблокирован

Когда я запускаю свое приложение на эмуляторе, Logcat показывает это:

04-22 16:21:30.685: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 78ms+17ms, total 360ms

04-22 16:21:30.685: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 143ms
04-22 16:21:31.845: D/dalvikvm(967): GC_CONCURRENT freed 1552K, 20% free 7019K/8720K, paused 116ms+18ms, total 554ms

04-22 16:21:31.845: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 268ms
04-22 16:21:32.435: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 75ms+9ms, total 192ms

04-22 16:21:32.435: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 73ms
04-22 16:21:32.945: D/dalvikvm(967): GC_CONCURRENT freed 1552K, 20% free 7019K/8720K, paused 75ms+10ms, total 209ms

04-22 16:21:32.945: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 70ms
04-22 16:21:33.434: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 78ms+12ms, total 192ms

и это продолжается до тех пор, пока я не выйду из приложения. Любое предложение? Спасибо

Ответ 1

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

Для WAIT_FOR_CONCURRENT_GC см. это: что означает блокировка WAIT_FOR_CONCURRENT_GC?

Это означает, что вы пытаетесь выделить память (например, создание объекта), и она не вписывается в память. То, что освобождает GC_CONCURRENT, вызвано. Его обычная сборка мусора.

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

Ответ 2

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

04-22 16: 21: 30.685: D/dalvikvm (967): GC_CONCURRENT освобожден 1545K, 20% бесплатно 7019K/8720K, пауза 78 мс + 17 мс, общая 360 мс

освобождает указывает, сколько памяти было освобождено

GC_CONCURRENT Вызывается, когда куча становится слишком большой, чтобы предотвратить переполнение.

пауза 78 мс + 17 мс - указывает, сколько времени потребовалось GC для завершения сбора.

Обратитесь

Дополнительно возьмите дамп памяти и проанализируйте инструмент MAT для использования дампа.

Ответ 3

Согласитесь в основном с @luxer, но я считаю, что вы не выделяете слишком много объектов, но выделяете некоторые огромные объекты. Если вы ссылаетесь на ссылку, указанную @luxer о WAIT_FOR_CONCURRENT_GC, вы поймете, что второй запуск gc запускается в вашем приложении, в то время как выполняется параллельный gc (который обычно запускается, когда заполнение кучи достигает мягкого предела). Второй gc мог быть вызван вами явно или потому, что не удалось выполнить распределение. Поскольку вы не указали, что вы вызываете System.gc(), я бы предположил, что ваши распределения не работают, и система пытается выполнить gc.

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

Ответ 4

Иногда это случается, когда у вас есть бесконечный цикл только потому, что какое-то условие всегда истинно.

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

Ответ 5

Я смог разрешить свою проблему путем отладки своего кода: в бесконечном цикле while скрывалась операция с БД, которая заполняла компонент и, следовательно, вызывала утечку памяти.

Может быть, если вы новичок, как я, проверьте циклы while/do-while/для распределения объектов и объектов в циклах. Не закрытые соединения и курсоры также должны быть закрыты.

Спасибо,