0

Objective-C/C コードを使用して、ヒープ割り当て (ライブ) のサイズを取得したいと考えています。XCodeインスツルメントでこれらの割り当てを見ることができます。この情報をコードで取得するにはどうすればよいでしょうか。

アプリによって割り当てられている HEAP 内の現在のライブ オブジェクトのサイズが必要です..? レジデント メモリ セット情報がありますが、それでは十分ではありません。

4

1 に答える 1

0

Linux の場合、 と の差を使用しendsbrk(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;
于 2013-10-09T14:00:36.077 に答える