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 回答