我想用Objective-C/C代码获得堆分配的大小(live)。正如我们可以在XCode工具中看到的那样。我们如何通过代码获取这些信息?
我想要我的应用程序正在分配的堆中当前活动对象的大小..?我有常驻内存设置信息,但这并不是全部帮助。
发布于 2013-10-09 22:00:36
对于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;https://stackoverflow.com/questions/19273705
复制相似问题