Реальная/резидентная память больше, чем выделения, о которых сообщает XCode Instruments

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

Для каждой записи в базе данных я создаю новый объект, который, надеюсь, выйдет из дуги :-).

Инструменты инструмента показывают мне, что мое приложение на самом деле имеет 5-6 МБ живого распределения. Но монитор активности говорит, что я на самом деле использую 100 МБ «физической» (реальной) памяти?

Как уменьшить 100 мб? Утечка памяти, которую вы видите, составляет всего 100 КБ, это не причина!?

Инструменты показывают 5,67 МБ «Live»

Инструменты

Монитор активности показывает 98 Мб реальной памяти

Монитор активности


person Togo    schedule 09.09.2012    source источник


Ответы (1)


Короткий ответ: Не беспокойтесь об этом — 100 МБ — это немного.

Главное, что вам нужно знать, это то, что «реальная» или резидентная оперативная память — это совсем не то же самое, что выделенная оперативная память. Они могут стать связанными, если вы выделите много оперативной памяти, но вы этого не сделали.

Почему они разные?

  • Освобожденная (или собранная из мусора) оперативная память часто не возвращается в ОС, поэтому некоторое время может оставаться «резидентной».

    В вашем случае это, скорее всего, является причиной — загрузка базы данных в выделенный большой объем памяти (переходный 1 ГБ) на некоторое время, а затем ее освобождение, в результате чего в вашем процесс.

    Обратите внимание, что в сборке мусора (включая ARC) пространство памяти, выделенное для объекта, может жить дольше, чем объект, который он когда-то удерживал, например. Если вы выделяете и немедленно освобождаете 10000 объектов размером 1 КБ, вы можете обнаружить, что ваша реальная оперативная память должна увеличиться на 10 МБ, даже если в любой момент используется только 1 КБ данных. Это связано с тем, что сборка мусора откладывается до специальной фазы очистки цикла выполнения вашей программы.

  • Резидентная оперативная память может быть запрошена только страницами по 4 КБ, это означает, что до 4 КБ резидентной ОЗУ может быть выделено даже для выделения 1 байта. Обычно malloc пытается разместить несколько распределений на одной и той же странице размером 4 КБ, но вы увидите некоторые потери из-за фрагментации.

  • выделенная ОЗУ, которая в данный момент не используется, может быть выгружена на диск, поэтому больше не является резидентной.

  • приложение включает некоторую (возможно, много) память, которая не "выделена" malloc, в том числе:

    • the application binary - code and data
    • библиотеки приложений - в частной или общей оперативной памяти
    • стек
    • Другая общая память
    • Возможно, графическая область (например, X11), открытые файловые буферы и mmaps (в зависимости от того, что мы считаем «выделенным».

    • для настольного компьютера или ноутбука; для встраиваемого устройства это много, а для телефона или планшета зависит.

person Alex Brown    schedule 09.09.2012