Куда уходит память моего iPad?
Я заставляю устройство (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 МБ дополнительной памяти, все остальное освобождается / удаляется.
Может ли быть так, что недостающая память используется фрагментацией кучи? Т.е. куча просто настолько фрагментирована, что накладные расходы блока занимают всю дополнительную, неучтенную память?
Кто-нибудь еще видел такое поведение?
Спасибо,
-Эрик
1 ответ
Вы должны использовать task_info
вместо host_statistics
чтобы извлечь использование памяти вашего приложения:
# include <mach/mach.h>
# include <mach/mach_host.h>
void dump_memory_usage() {
task_basic_info info;
mach_msg_type_number_t size = sizeof( info );
kern_return_t kerr = task_info( mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size );
if ( kerr == KERN_SUCCESS ) {
NSLog( @"task_info: 0x%08lx 0x%08lx\n", info.virtual_size, info.resident_size );
}
else {
NSLog( @"task_info failed with error %ld ( 0x%08lx ), '%s'\n", kerr, kerr, mach_error_string( kerr ) );
}
}