Любая возможная опция заключается в использовании специальной файловой оболочки для имитации переменных в виде файлов. Вы можете добиться этого, используя это:
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)
GC_FOR_MALLOC означает, что GC был вызван, потому что в куче осталось недостаточно памяти для выполнения выделения. Может возникнуть срабатывание при создании новых объектов.
GC_EXPLICIT означает, что сборщик мусора явно попросил собрать вместо того, чтобы запускаться с помощью водяных знаков в куче.
Также есть несколько других:
GC_CONCURRENT Срабатывает, когда происходит сбой в потоке. куча достигла определенного количества объектов для сбора.
GC_EXTERNAL_ALLOC означает, что виртуальная машина пытается уменьшить объем памяти, используемой для собираемых объектов, чтобы освободить место для большего количества не собираемых.
Обновление: произошли изменения первого события в более поздних версиях Android. Теперь это называется GC_FOR_ALLOC. Существует также новое событие, хотя оно очень редко встречается в современных телефонах: GC_BEFORE_OOM означает, что система работает на самом низком уровне в памяти, и что выполняется финальный GC, чтобы избежать вызова убийцы с низкой памятью.
Другое место, где объясняются сообщения сборщика мусора Dalvik, находится в этом видео: Google I / O 2011: Управление памятью для Android Apps
Примерно через 14 минут в презентацию , он разбивает формат сообщения. (BTW, у этого видео есть действительно хорошая информация об утечках памяти отладки)
Грубо говоря, формат [Reason] [Amount Freed], [Heap Statistics], [Статистика внешней памяти], [ Пауза Время]
Роберт / юку уже дал информацию о значении этих.
Например освобожден 2125K
Самоочевидный
Например. 47% бесплатно 6214K / 11719K
Эти числа отражают условия после запуска GC. «47% свободных» и 6214 тыс. Отражают текущее использование кучи. 11719K представляет общий размер кучи. Из того, что я могу сказать, куча может расти / сокращаться, поэтому вы не обязательно будете иметь OutOfMemoryError, если вы нажмете этот предел.
Например external 7142K
Примечание: Это может существовать только в пре-сотовых версиях Android (до 3.0).
Перед Honeycomb растровые изображения выделены вне вашей виртуальной машины (например, Bitmap.createBitmap () выделяет растровое изображение извне и выделяет всего несколько десятков байтов на вашей локальной куче). Другие примеры внешних распределений для java.nio.ByteBuffers.
Если это параллельное событие GC, будет указано два раза. Один из них - для паузы перед GC, один - для паузы, когда GC в основном выполняется. Например. приостановлено 3 мс + 5 мс
Для неконкурентных событий GC есть только одно время паузы, и оно обычно намного больше. Например. приостановлено 87 мс
Я также нашел это в источниках 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;
GC_FOR_MALLOC
, ноGC_FOR_ALLOC
. Это одно и то же событие и просто переименовано, чтобы удалить ссылку на имя malloc () или другое событие? – Matthias 14 October 2013 в 12:42