【发布时间】:2013-10-16 21:51:43
【问题描述】:
我想使用 Objective-C/C 代码获取堆分配(实时)的大小。我们可以在 XCode 工具中看到这些分配。我们如何通过代码获取这些信息?
我想要我的应用程序正在分配的 HEAP 中当前活动的对象大小..?我有常驻内存集信息,但这并不完整。
【问题讨论】:
标签: c objective-c memory heap-memory
我想使用 Objective-C/C 代码获取堆分配(实时)的大小。我们可以在 XCode 工具中看到这些分配。我们如何通过代码获取这些信息?
我想要我的应用程序正在分配的 HEAP 中当前活动的对象大小..?我有常驻内存集信息,但这并不完整。
【问题讨论】:
标签: c objective-c memory heap-memory
对于 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;
【讨论】:
/proc/self/stat 中的字段 24,然后将其乘以 sysconf(_SC_PAGESIZE)。对于 OS X,task_info 将直接为您查询 RSS。