Подтвердить что ты не робот

Почему так много GC_FOR_ALLOC в простом приложении?

Я получаю слишком много GC_FOR_ALLOC от dalvikvm. Я получаю XML из службы REST: в одном действии я анализирую около 100 строк программно (меня), а в другом упражнении я использую SimpleXML для разбора около 200 строк.

В первом я получаю 50 GC_FOR_ALLOC. Во втором я получаю как 300! (Я даже не могу опубликовать его, тело составляет 29579 символов, и это разрешено только 30k)

Я искал, и почти все жалуются на gc_for_ "M" alloc, а не gc_for_ "A" lloc.

Проблема SimpleXML в том, что созданные экземпляры?

Я вывешу logcat dump dalvikvm, возможно, значения имеют некоторую информацию.

Большое спасибо за вашу помощь.

12-11 06:13:49.564: D/dalvikvm(6759): GC_FOR_ALLOC freed 362K, 13% free 4116K/4688K, paused 181ms, total 182ms
12-11 06:13:50.074: D/dalvikvm(6759): GC_FOR_ALLOC freed 303K, 13% free 4134K/4708K, paused 142ms, total 142ms
.... repeated many times .....
12-11 06:14:06.254: D/dalvikvm(6759): GC_FOR_ALLOC freed 73K, 13% free 4159K/4768K, paused 53ms, total 53ms
12-11 06:14:06.314: D/dalvikvm(6759): GC_FOR_ALLOC freed 103K, 13% free 4159K/4768K, paused 56ms, total 57ms
12-11 06:14:06.374: D/dalvikvm(6759): GC_FOR_ALLOC freed 29K, 12% free 4203K/4768K, paused 54ms, total 54ms
12-11 06:14:06.424: D/dalvikvm(6759): GC_FOR_ALLOC freed 73K, 13% fre
4b9b3361

Ответ 1

Вы можете увидеть наиболее недавно выделенные объекты, используя DDMS Allocation Tracker (файлы отладки памяти, старый пост в блоге, ddms docs). Это покажет вам, что выделяется и дает вам трассировку стека для места, где выполняется распределение.

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

Ответ 2

В Android Dalvik VM GC_FOR_ALLOC используется в сегменте выделения объекта, когда пространство для пространства dlmalloc недостаточно для нового или heap->bytesAllocated + n > hs->softLimit. Вы можете установить dalvik.system.setTargetHeapUtilization ниже для более свободного пространства кучи.

Ответ 3

вы можете использовать MAT учебное пособие по MAT

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

Ответ 4

Если вы получаете несколько GC_FOR_ALLOC, пока ваше приложение отстает, существует большая вероятность, что ошибка находится в цикле. Проверьте, где строка кода начинает запускать GC, а затем начинает отслеживать код. По моему опыту, я ошибался в своем внутреннем итераторе цикла, который заставляет программу создавать бесконечный цикл. Я создал ошибку следующим образом:

for(int i=0; i<list.size(); i++) {
     for(int j=i+1 j<list.size(); i++) {

     // I mistyped the iterator of integer j with i
     // making an infinite loop which triggered the GC.
     //appears many times

     }
}

Ответ 5

Сегодня я сталкиваюсь с той же проблемой. Я нахожу замкнутый цикл в моем коде, например while (i < xx), но я не реализую инструкцию я ++ в теге while. Так появились сообщения, подобные вам. Сначала проверьте свой код.

Ответ 6

Мой журнал:

D/dalvikvm: GC_FOR_ALLOC freed 549K, 9% free 7878K/8596K, paused 30ms, total 34ms

...freed 539K, 9% free 7888K/8596K, paused 30ms, total 30ms
...freed 1856K, 21% free 8083K/10108K, paused 51ms, total 51ms
...freed 582K, 9% free 7845K/8596K, paused 38ms, total 38ms

Объясняю:

Когда ваше приложение получает больше памяти для каждого приложения. Dalvik/ Ant вызывает сборщик мусора.

Что ограничивает память для вашего приложения, решит Dalvik/ Ant. Как вы видите, мое приложение Dalvik принимает 8596K (двойной случай) и 8083K (один случай).

И ограничить изменения во время выполнения.

И вы не можете быть уверены, когда это произойдет. Но вы можете уменьшить вероятность. Уменьшение объема памяти, потребляемой вашим приложением.

PS: Решите, когда вызов GC заставляет Dalvik/ Ant. И вы не можете быть уверены, когда это произойдет. Но вы можете уменьшить вероятность. Уменьшение объема памяти, потребляемой вашим приложением.

PS: В "Monitor android" см. вкладку "Мониторы", графику "Память". И используйте кнопки: "pause (enabled)", "Инициировать GC", "Dump Java Heap" "Начать отслеживание размещения (очень полезно)". И используйте официальное руководство для этого:

https://developer.android.com/studio/profile/am-memory.html?utm_source=android-studio.

Насколько я понимаю, приложение не должно останавливать/приостанавливать работу или сбой, когда VM вызывает GC.