自分のアプリが使用しているメモリサイズを取得するには

これまで、iPhoneiPod touchの全体でどのようなメモリ使用量になっているのかということについては、何度か説明してきました。当然のことですが、アプリ開発者に取ってはそれだけでなく、自分が作ったアプリが、いったいどのくらいメモリを使用しているのかを知ることは重要です。
XCodeで、「実行 --> パフォーマンスツールを使って開始」の、Activety Monitorで見ることができますが、デバッガとの併用ができないので使いにくいこともあります。その場合には、*1。/Developer/Applications/Instruments.appを独立して起動することで、デバッグしながらメモリの状況を見ることができますが、自分でメモリ使用量を取得してログ出力するようにしておくと便利です。

以下に、そのためのサンプルコードを示します。

#import <Foundation/Foundation.h>
#include <mach/mach.h>

...

   struct task_basic_info t_info;
   mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;

   if (task_info(current_task(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count)!= KERN_SUCCESS)
   {
       NSLog(@"%s(): Error in task_info(): %s",
             __FUNCTION__, strerror(errno));
   }

   // 物理メモリの使用量(byte) - Activity MonitorのReal Memoryに該当
   u_int rss = t_info.resident_size;

   // 仮想メモリの使用量(byte) - Activity MonitorのVirtual Memoryに該当??
   u_int vs = t_info.virtual_size;

   NSLog(@"RSS: %u Bytes, VS: %u Bytes.", rss, vs);

例えば、これをMalloc Simulatorで実行してみると、


RSS: 4575232 Bytes, VS: 328544256 Bytes.

という数値が出ました。同じものをActivity Monitorで実行した場合、Real Memoryの値が、4.36MBになっており、resident_sizeの値と一致しています。(virtual_sizeの値は、ありえない大きな数値が出ており、合っていないようです。)

Malloc Simulatorが、今後リリースされるようであれば、バージョンアップ時に自分のresident_sizeも表示するようにしたいと思っています。

*1:この部分の記述が誤っていたので、訂正させていただきます。