Уборка мусора для далвиков - PullRequest
6 голосов
/ 22 июня 2011

Я работаю с виртуальной машиной Dalvik и хотел бы узнать, есть ли какие-либо инструменты для анализа сбора мусора в dalvik.Я знаю о трекере распределения, но я ищу что-то более сложное.

1 Ответ

0 голосов
/ 08 августа 2013

Получить журнал всех операций GC за время:

Каждый раз, когда происходит GC, вы получаете строку в LogCat.

08-08 16:42:21.998: D/dalvikvm(26942): GC_CONCURRENT freed 773K, 26% free 4739K/6368K, paused 4ms+3ms, total 92ms
08-08 16:42:21.998: D/dalvikvm(26942): WAIT_FOR_CONCURRENT_GC blocked 11ms

Кажется, я получаю их для всех приложений на моем устройстве.

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

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

Анализ конкретного прогона ГХ:

Если вы хотите проанализировать, что происходит в одной конкретной операции ГХ, лучшим инструментом для работы является Eclipse MAT. Eclipse MAT может анализировать дампы кучи. Сделайте снимок кучи, дождитесь GC (или запустите его самостоятельно с помощью DDMS), а затем сделайте еще один снимок.

Eclipse MAT может показать вам дельту между двумя снимками. Обратите внимание, что вы увидите как новые, так и связанные с GC освобождения. Более подробная информация о сравнении снимков доступна здесь .

Некоторые другие мысли:

Я не уверен, сколько вы сможете узнать из анализа процесса GC. Внутренняя работа GC - это деталь реализации. Может изменяться без уведомления между версиями ОС / устройствами / конфигурациями.

Я пытаюсь придумать способы улучшить задержку GC, которую вы испытываете ... Мне кажется, что GC обычно работает, когда условия памяти низки. Это, вероятно, происходит во время новых распределений, поэтому GC может работать, когда ваша служба активна. Возможно, если вы используете время, когда ваша служба неактивна для GC вручную, вы сможете сократить количество GC, которые происходят на критическом пути ответа на веб-запрос. Чтобы попробовать это, я бы добавил простой фоновый таймер и сбрасывал его всякий раз, когда моя служба становилась активной (новый запрос). Когда таймер тикает (бездействие в течение некоторого периода времени), я запускаю System.gc() вручную.

...