我想使用 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;