Objective-C/C コードを使用して、ヒープ割り当て (ライブ) のサイズを取得したいと考えています。XCodeインスツルメントでこれらの割り当てを見ることができます。この情報をコードで取得するにはどうすればよいでしょうか。
アプリによって割り当てられている HEAP 内の現在のライブ オブジェクトのサイズが必要です..? レジデント メモリ セット情報がありますが、それでは十分ではありません。
Objective-C/C コードを使用して、ヒープ割り当て (ライブ) のサイズを取得したいと考えています。XCodeインスツルメントでこれらの割り当てを見ることができます。この情報をコードで取得するにはどうすればよいでしょうか。
アプリによって割り当てられている HEAP 内の現在のライブ オブジェクトのサイズが必要です..? レジデント メモリ セット情報がありますが、それでは十分ではありません。
Linux の場合、 と の差を使用しend
てsbrk(0)
現在のヒープ サイズを判断できます。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern char etext, edata, end;
int
main(int argc, char *argv[])
{
printf("First address past:\n");
printf(" program text (etext) %10p\n", &etext);
printf(" initialized data (edata) %10p\n", &edata);
printf(" uninitialized data (end) %10p\n", &end);
printf(" Heap Size (sbrk() - end) %10p\n", sbrk(0) - (void *)&end);
exit(EXIT_SUCCESS);
}
Linux では、BSS セグメントの直後にヒープが開始されるため、これが機能します。
編集:
レジデント セット (プロセスで現在使用されている物理メモリの量) を探している場合は、Linux の場合はそれを読み取る必要があります/proc/self/stat
(残念ながら、のフィールドgetrusage
は廃止されています)。
FILE *fpstat = fopen("/proc/self/stat", "r");
long int rss;
fscanf(fpstat, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %l*u"
"%l*u %l*d %l*d %*d %*d %*d %*d %*u %l*u %ld", &rss);
rss *= sysconf(_SC_PAGE_SIZE); // to get memory in bytes
OS X の場合、これにはネイティブの Mach メソッドがあります。
struct task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
task_info(MACH_PORT_NULL, TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count);
size_t rss = t_info.resident_size;