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

Инструменты с iOS: почему монитор памяти не согласен с Allocations?

Как видно на этом экране, снятом с инструментов, Allocations считает, что мое приложение (Ongo) использует только 7,55 МБ памяти, а Memory Monitor - 53.30. Кроме того, свободная системная память практически не коррелирует с объемом памяти, используемой приложением. Кто-нибудь знает, почему существует такое большое несогласие между этими двумя инструментами? Кроме того, можно ли найти источник низкой системной памяти или как быстро ее отключить? Мое приложение не похоже на утечку памяти, но как-то оно исчерпывает системные ресурсы.

Спасибо

Instruments Y U Lie?

4b9b3361

Ответ 1

Для тех, кто видит этот пост после 2012 года:

Память, действительно загруженная в физическую память устройства, - это резидентная память в инструменте отслеживания VM.

Инструмент распределения только отмечает память, созданную malloc/[NSObject alloc], и некоторый фрейм-буфер, например, растровое изображение с декомпрессированным изображением не входит в Инструмент распределения, но он всегда занимает большую часть вашей памяти.

Пожалуйста, смотрите WWDC 2012 Сессия 242 Производительность приложений iOS: Память для получения информации от Apple.

Ответ 2

Я считаю, что это связано с тем, что использование памяти из OpenGL ES скрыто от ObjectAlloc, но подсчитано в Memory Monitor. Например, см. Тесты zoul в его вопросе здесь, где он замечает небольшой всплытие ObjectAlloc при создании текстуры, но затем эта память исчезает с этого инструмента при его выключении к OpenGL ES. Монитор памяти по-прежнему отслеживает эту память текстур.

Это должно включать визуальный аспект элементов пользовательского интерфейса, таких как слои и представления, потому что CALayers являются эффективными оболочками для текстур OpenGL ES. Фактическое представление 2D-изображения ваших элементов пользовательского интерфейса, по-видимому, не отслеживается ObjectAlloc, что приводит к более низким общим значениям в ObjectAlloc.

ObjectAlloc по-прежнему хорош для отслеживания номеров и типов распределений и еще более ценен с момента появления функциональности heapshot. Вы просто хотите связать его с Memory Monitor, чтобы посмотреть на ваше истинное использование общей памяти.

Ответ 3

Монитор памяти будет считать большинство или все ресурсы, хранящиеся в приложении, включая косвенно выделенные на уровне ядра. Это включает в себя видеопамять AFAIK (текстуры и т.д.), Как предлагал Брэд, но также файлы с отображением памяти и, возможно, довольно большие структуры ядра, такие как сокеты. Список, вероятно, довольно длинный...

Ответ 4

Любой код, заключенный в фигурные скобки диспетчерского вызова в GCD, защищен от двух факторов: сообщения об ошибках и, иногда, подсчета распределения. Обычно это относится только к CoreFoundation или к любой другой вещи, не связанной с UIKit или без NSFoundation.