Нужна помощь в понимании GC_FOR_ALLOC [dубликат]

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

1) Прежде всего, зарегистрируйте свою обертку (только один раз в файле, используйте ее как session_start ()):

  stream_wrapper_register (  'var', VarWrapper);   

2) Затем определите свой класс-оболочку (он очень быстро написан, не совсем корректен, но он работает):

  класс VarWrapper {protected $ pos  = 0;  защищенный $ content;  public function stream_open ($ path, $ mode, $ options, & amp; $ open_path) {$ varname = substr ($ path, 6);  глобальное $$ varname;  $ this- & gt; content = $$ varname;  return true;  } public function stream_read ($ count) {$ s = substr ($ this- & gt; content, $ this- & gt; pos, $ count);  $ this- & gt; pos + = $ count;  return $ s;  } public function stream_stat () {$ f = fopen (__ file__, 'rb');  $ a = fstat ($ f);  fclose ($ е);  if (isset ($ a [7])) $ a [7] = strlen ($ this- & gt; content);  return $ a;  }}  

3) Затем используйте любую функцию файла с вашей оболочкой в ​​протоколе var: // (вы можете использовать ее для include, require и т. д.):

   глобальный $ __ myVar;  $ __ myVar = 'Введите теги здесь';  $ data = php_strip_whitespace ('var: // __ myVar');   

Примечание. Не забудьте указать переменную в глобальной области (например, глобальный $ __ myVar)

62
задан Randy Sugianto 13 June 2011 в 11:31
поделиться

3 ответа

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

GC_EXPLICIT означает, что сборщик мусора явно попросил собрать вместо того, чтобы запускаться с помощью водяных знаков в куче.

Также есть несколько других:

GC_CONCURRENT Срабатывает, когда происходит сбой в потоке. куча достигла определенного количества объектов для сбора.

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

Обновление: произошли изменения первого события в более поздних версиях Android. Теперь это называется GC_FOR_ALLOC. Существует также новое событие, хотя оно очень редко встречается в современных телефонах: GC_BEFORE_OOM означает, что система работает на самом низком уровне в памяти, и что выполняется финальный GC, чтобы избежать вызова убийцы с низкой памятью.

122
ответ дан Robert 16 August 2018 в 02:31
поделиться
  • 1
    Благодаря! Просто интересно, откуда вы получили эту информацию? – Randy Sugianto 12 February 2011 в 10:09
  • 2
    Опыт. Я много работаю в источнике платформы Android, я наставник компаний, которые строят свои собственные Android-устройства, и я обучил около тысячи человек разработке программного обеспечения для Android (как для устройств, так и для приложений). – Robert 12 February 2011 в 10:26
  • 3
    У меня есть listview, и GC_CONCURRENT появляется довольно часто в log cat. Также некоторые GC_FOR_ALLOC. Должен ли я беспокоиться об этом? – Sudarshan Bhat 22 August 2012 в 11:32
  • 4
    Enigma, вы должны просмотреть код для рисования элементов списка. Сообщения журнала указывают, что вы, вероятно, выделяете и освобождаете память каждый раз, когда вы рисуете элемент списка. Прочтите эту серию статей о списках, написанных Марком Мерфи. [D0] androidguys.com/2008/07/14/fancy-listviews-part-one – Robert 23 August 2012 в 07:21
  • 5
    В моих журналах я не вижу GC_FOR_MALLOC , но GC_FOR_ALLOC . Это одно и то же событие и просто переименовано, чтобы удалить ссылку на имя malloc () или другое событие? – Matthias 14 October 2013 в 12:42

Другое место, где объясняются сообщения сборщика мусора Dalvik, находится в этом видео: Google I / O 2011: Управление памятью для Android Apps

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

Грубо говоря, формат [Reason] [Amount Freed], [Heap Statistics], [Статистика внешней памяти], [ Пауза Время]

Причина

Роберт / юку уже дал информацию о значении этих.

Amount Freed

Например освобожден 2125K

Самоочевидный

Статистика кучи

Например. 47% бесплатно 6214K / 11719K

Эти числа отражают условия после запуска GC. «47% свободных» и 6214 тыс. Отражают текущее использование кучи. 11719K представляет общий размер кучи. Из того, что я могу сказать, куча может расти / сокращаться, поэтому вы не обязательно будете иметь OutOfMemoryError, если вы нажмете этот предел.

Статистика внешней памяти

Например external 7142K

Примечание: Это может существовать только в пре-сотовых версиях Android (до 3.0).

Перед Honeycomb растровые изображения выделены вне вашей виртуальной машины (например, Bitmap.createBitmap () выделяет растровое изображение извне и выделяет всего несколько десятков байтов на вашей локальной куче). Другие примеры внешних распределений для java.nio.ByteBuffers.

Pause Time

Если это параллельное событие GC, будет указано два раза. Один из них - для паузы перед GC, один - для паузы, когда GC в основном выполняется. Например. приостановлено 3 мс + 5 мс

Для неконкурентных событий GC есть только одно время паузы, и оно обычно намного больше. Например. приостановлено 87 мс

35
ответ дан jfritz42 16 August 2018 в 02:31
поделиться

Я также нашел это в источниках Android, dalvik / vm / alloc / Heap.h . Пусть это будет полезно.

  typedef enum {/ * Недостаточно места для «обычного» объекта, который будет выделен.  * / GC_FOR_MALLOC, / * Автоматический ГК, инициированный превышением порога заполнения кучи.  * / GC_CONCURRENT, / * Явный GC через Runtime.gc (), VMRuntime.gc () или SIGUSR1.  * / GC_EXPLICIT, / * GC, чтобы попытаться уменьшить площадь кучи, чтобы обеспечить больше памяти без GC.  * / GC_EXTERNAL_ALLOC, / * GC, чтобы выгрузить содержимое кучи в файл, используется только в WITH_HPROF * / GC_HPROF_DUMP_HEAP} GcReason;   
26
ответ дан Pang 16 August 2018 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: