что означают gc\_for\_malloc, gc\_explicit и другие gc\_ * в android logcat?

<p>если вы видите журналы android, вы можете увидеть много таких вещей.</p><p>что они имеют в виду, зная, что они могут помочь нам лучше распределять память.</p><p>пример:</p><pre><code> 28470 dalvikvm d gc\_for\_malloc freed 665 objects / 239992 bytes in 71ms 28470 dalvikvm d gc\_for\_malloc freed 673 objects / 240288 bytes in 87ms 21940 dalvikvm d gc\_explicit freed 4802 objects / 185320 bytes in 78ms 28470 dalvikvm d gc\_for\_malloc freed 666 objects / 240536 bytes in 63ms </code></pre>

<p><strong>gc\_for\_malloc</strong> означает, что сборщик мусора был запущен, поскольку в куче не хватило памяти для выполнения выделения. может быть вызвано, когда создаются новые объекты.</p><p><strong>gc\_explicit</strong> означает, что сборщик мусора был явно задан для сбора, а не вызван высокими отметками в куче. происходит повсеместно, но, скорее всего, когда поток прерывается или когда связь с переплетом прерывается.</p><p>также есть несколько других:</p><p><strong>gc\_concurrent</strong> срабатывает, когда куча достигла определенного количества объектов для сбора.</p><p><strong>gc\_external\_alloc</strong> означает, что vm пытается уменьшить объем памяти, используемой для собираемых объектов, чтобы освободить место для большего количества не подлежащих сбору.</p><p><strong>обновление:</strong> произошла смена имени первого события в более поздних версиях android. теперь он называется "gc\_for\_alloc". также доступно новое событие, хотя оно очень редко встречается в современных телефонах: <strong>gc\_before\_oom</strong> означает, что системе действительно не хватает памяти, и что выполняется финальный gc, чтобы избежать вызова низкого убийца памяти.</p>

<p>другое место, где объясняются сообщения сборщика мусора dalvik, - это видео: <a href="http://www.youtube.com/watch?v=\_cruqy55hok">google i/o 2011: управление памятью для android apps</a> </p><p>примерно через 14 минут после презентации он разбивает формат сообщения. (кстати, у этого видео действительно хорошая информация об устранении утечек памяти)</p><p>грубо говоря, формат <code>[reason] [amount freed], [heap statistics], [external memory statistics], [pause time]</code></p><h2>причина</h2><p>роберт/юку уже дал информацию о значении этих.</p><h2>количество свободных</h2><p>например. <code>freed 2125k</code></p><p>самоочевидный</p><h2>статистика кучи</h2><p>например. <code>47% free 6214k/11719k</code></p><p>эти цифры отражают условия после запуска gc. "47% свободного" и 6214k отражают текущее использование кучи. 11719k представляет общий размер кучи. из того, что я могу сказать, куча может увеличиваться/уменьшаться, поэтому у вас не обязательно будет ошибка outofmemoryerror, если вы достигнете этого предела.</p><h2>статистика внешней памяти</h2><p>например, <code>external 7142k/8400k</code></p><p>примечание. это может существовать только в версиях android (до 3.0), предшествующих honeycomb.</p><p>перед honeycomb растровые изображения размещаются вне вашей vm (например, bitmap.createbitmap () выделяет растровое изображение извне и выделяет только несколько десятков байтов в локальной куче). другие примеры внешних распределений для java.nio.bytebuffers.</p><h2>время паузы</h2><p>если это параллельное событие gc, там будет указано два раза. один - для паузы перед gc, другой - для паузы, когда gc в основном делается. например. <code>paused 3ms+5ms</code></p><p>для непараллельных событий gc существует только одна пауза, которая обычно намного больше. например. <code>paused 87ms</code></p>

<p>я также нашел это в источниках android, <a href="https://www.gitorious.org/0xdroid/dalvik/blobs/b874ab98306a109c4988bb1cde687a24f4f8201f/vm/alloc/heap.h#line68"><code>dalvik/vm/alloc/heap.h</code></a> . пусть это будет полезно.</p><pre><code>typedef enum { /* not enough space for an "ordinary" object to be allocated. */ gc\_for\_malloc, /* automatic gc triggered by exceeding a heap occupancy threshold. */ gc\_concurrent, /* explicit gc via runtime.gc(), vmruntime.gc(), or sigusr1. */ gc\_explicit, /* gc to try to reduce heap footprint to allow more non-gc'ed memory. */ gc\_external\_alloc, /* gc to dump heap contents to a file, only used under with\_hprof */ gc\_hprof\_dump\_heap } gcreason; </code></pre>