デバイスの空きメモリ量を取得する
host_statistics() を使用して、vm_statistics_data_t 構造体を取得します。その中の free_count という値が空きメモリ量を示しています。(この値の単位はページ数なので、単位をバイトに変換するためにはページサイズを掛ける必要があります。)
#import <mach/mach.h>
+ (unsigned int)getFreeMemory {
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");
return 0;
}
natural_t mem_free = vm_stat.free_count * pagesize;
return (unsigned int)mem_free;
}
アプリが使用しているメモリ量を取得する
タスク(いわゆるプロセス)の基本情報を取得するための関数 task_info() を使用して、task_basic_info 構造体を取得します。その中の resident_size という値が、物理メモリ使用量(バイト)を示しています。
struct task_basic_info basic_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
kern_return_t status;
status = task_info(current_task(), TASK_BASIC_INFO,
(task_info_t)&basic_info, &t_info_count);
if (status != KERN_SUCCESS)
{
NSLog(@"%s(): Error in task_info(): %s",
__FUNCTION__, strerror(errno));
}
vm_size_t residentSize = basic_info.resident_size;
アプリの CPU 負荷を取得する
使用メモリ量を取得する際に用いた task_info() は第2引数に渡す値に応じて様々な情報を得ることができます。
メモリ使用量を取得する場合には TASK_BASIC_INFO を指定しましたが、 TASK_THREAD_TIMES_INFO を指定することで実行中のスレッドの CPU 使用時間を取得することができます。
struct task_thread_times_info thread_info;
t_info_count = TASK_THREAD_TIMES_INFO_COUNT;
kern_return_t status;
status = task_info(current_task(), TASK_THREAD_TIMES_INFO,
(task_info_t)&thread_info, &t_info_count);
if (status != KERN_SUCCESS) {
NSLog(@"%s(): Error in task_info(): %s",
__FUNCTION__, strerror(errno));
return;
}
uint64_t userTime = tval2msec(thread_info.user_time);
上記コードで用いている tval2msec は time_value_t 型で得られた CPU 使用時間を msec に変換するためのマクロです。
#define tval2msec(tval) ((tval.seconds * 1000) + (tval.microseconds / 1000))
アプリ内でメモリ使用量と CPU 負荷をリアルタイム表示
上記の方法で取得したメモリ使用量と CPU 負荷、加えて View の数をアプリ内にリアルタイム表示するクラスを公開しています。よろしければご利用ください。