システム情報の取得
従来の携帯コンテンツと比べてしまうと、iPhoneはかなりメモリに余裕がある端末だとは思うんですけど、
余裕があれば余裕があっただけ、使ってしまいたくなるのがコンテンツ屋ってもんです.
そんなわけで、開発中、自身のアプリケーションの中で後どのぐらいメモリが使えるのかとか、ある処理を
行ったときにどの程度メモリを消費したのかを把握できるようになっておくと便利です.
xcode には、Shark とか Instruments とか便利なツールが揃っていますが、ツールでは把握しづらい部分を
計測するためにも、利用メモリ量の取得を行えるようにしてみました.
そんなわけで、いつものように足跡を残しておきます.
利用メモリ量の取得
現在のメモリの状況を取得するためには、 host_statistics() を利用する.
こんな感じに、利用すればよい.
#include <mach/host_info.h> #include <mach/mach_init.h> #include <mach/mach_host.h> void vmInfo() { struct vm_statistics a_vm_info; mach_msg_type_number_t a_count = HOST_VM_INFO_COUNT; host_statistics( mach_host_self(), HOST_VM_INFO, (host_info_t)&a_vm_info ,&a_count); }
vm_statictics 構造体は、次のように定義されている.
struct vm_statistics { natural_t free_count; // 空きメモリ容量(ページ数) natural_t active_count; // 現在使用中のメモリ容量(ページ数) natural_t inactive_count; // 現在非使用中のメモリ容量(ページ数) natural_t wire_count; // 現在固定中のメモリ容量(ページ数) natural_t zero_fill_count; // ゼロで埋まっているページ数(よくわからん) natural_t reactivations; // よくわからん natural_t pageins; // よくわからん natural_t pageouts; // よくわからん natural_t faults; // よくわからん natural_t cow_faults; // よくわからん natural_t lookups; // よくわからん natural_t hits; // よくわからん natural_t purgeable_count; // よくわからん natural_t purges; // よくわからん natural_t speculative_count; // よくわからん };
よくわからんって書いてあるところは、私が意味を分かっていない部分.
(教えて偉い人)
ここから取得できるメモリ量の単位は、ページ数なので byte 単位に変換するためにはページサイズを掛ける必要がある.
int a_free_size = a_vm_info.free_count * vm_page_size;
host_basic_info の取得
全体で利用できる(はずの)総メモリサイズなんかを取得したい場合には、 host_info() を利用すればよい.
今のところ意味はなさそうだけれども、CPU種別なんかも取ってくることができる.
#include <mach/host_info.h> #include <mach/mach_init.h> #include <mach/mach_host.h> void hostInfo() { struct host_basic_info a_host; mach_msg_type_number_t a_count = HOST_BASIC_INFO_COUNT; host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&a_host, &a_count); }
host_basic_info は、こんな感じに定義されている
struct host_basic_info { integer_t max_cpus; // 最大のCPU数 integer_t avail_cpus; // 現在利用できるCPUの数 natural_t memory_size; // メモリサイズ(byte) cpu_type_t cpu_type; // CPU の種別1 cpu_subtype_t cpu_subtype; // CPU の種別2 cpu_threadtype_t cpu_threadtype; // CPU のスレッド種別 integer_t physical_cpu; // 現在利用できる物理的なCPUの数 integer_t physical_cpu_max; // 最大で利用できる物理的なCPUの数 integer_t logical_cpu; // 現在の論理的なCPUの数 integer_t logical_cpu_max; // 最大の論理的なCPUの数 uint64_t max_mem; // 実際の物理メモリサイズ };
cpu_type / cpu_subtype / cpu_threadtype に割り当てられている定数は、
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/include/mach/machine.h
から確認できる.
必要そうなものだけ引っ張ってきてみるとこんな感じになっているはず
#define CPU_TYPE_X86 ((cpu_type_t) 7) #define CPU_TYPE_ARM ((cpu_type_t) 12) #define CPU_SUBTYPE_ARM_V6 ((cpu_subtype_t) 6) #define CPU_THREADTYPE_NONE ((cpu_threadtype_t) 0)
まぁ、いつかお世話になるかもしれない
おまけ
これで、メモリの使用量を測ることができるようになりました.
ただ、非使用中のメモリ容量と空きメモリ容量の違いなんかについてはよく分かっていません.
(非使用中のメモリ容量(非活性のメモリ容量?)は、いつ利用できるようになんのさ?)
他にも、把握していないパラメータ満載です.
(どなたか、是非フォローお願いします)
参考ページ
[The iPhone Development Playground]
2009-01-24 メモリー使用量の謎(2)
http://d.hatena.ne.jp/kimada/20090124/1232809647
iPhone のアプリケーションの "SysStats Lite" の作者さんのページ.
このアプリの存在を知って、自身のアプリから様々な状況を把握できることを知りました.
技術情報がとても丁寧にまとまっているので、一度目を通しておくと良いと思います.
[Christopher-727の日記]
2007-11-10 Macのシステムコール
http://d.hatena.ne.jp/Christopher-727/20071110
実際の値の取得方法について参考にさせていただきました.
xcode 付属のドキュメントを漁っても、システムコールのことは書かれていないようだったのでとても参考になりました.
(探し方が悪いだけ?)
ありがとうございました