Я заставляю устройство (iPad) не хватать памяти, очевидно, поэтому оно выбрасывает мое приложение. Я пытаюсь понять, что происходит, поскольку Instruments сообщает мне, что я использую около 80 МБ, и на устройстве не работает другое приложение.
Я нашел этот фрагмент кода, чтобы запросить у системы Маха под iOS статистику памяти:
#import <mach/mach.h>
#import <mach/mach_host.h>
static void print_free_memory () {
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)
NSLog(@"Failed to fetch vm statistics");
/* Stats in bytes */
natural_t mem_used = (vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
}
Когда я использую эту функцию для получения трех значений памяти, я обнаруживаю, что значение mem_total снижается, даже если общее количество mem_used не меняется слишком сильно. Вот две последовательные строки вывода:
<Warning>: used: 78585856 free: 157941760 total: 236527616
некоторый код выполняется ....
<Warning>: used 83976192 free: 10551296 total: 94527488
Таким образом, я могу перейти с 157 МБ свободной памяти до 10 МБ свободной памяти, но мое использование увеличилось только с 78 МБ до 84 МБ. Общий объем памяти уменьшился с 236 МБ до 94 МБ.
Имеет ли это смысл для кого-либо? В течение этого периода на устройстве не выполняются другие приложения, устройство должно быть полностью предназначено для моего приложения.
Весь код, который выполняется между двумя проверками памяти, является собственным кодом C ++, который вообще не взаимодействует с какой-либо средой Apple. Действительно, существует множество обращений к системе памяти для выделения и освобождения объектов из кучи C ++, но, как видно, в конце выделено только около 4 МБ дополнительной памяти, все остальное освобождается / удаляется.
Может ли быть так, что недостающая память используется фрагментацией кучи? То есть Разве куча просто настолько фрагментирована, что накладные расходы блока занимают всю дополнительную неучтенную память?
Кто-нибудь еще видел такое поведение?
Спасибо
-Эрик