【问题标题】:How to calculate size of Dynamic Heap Allocations in objective-c/c?如何计算objective-c/c中动态堆分配的大小?
【发布时间】:2013-10-16 21:51:43
【问题描述】:

我想使用 Objective-C/C 代码获取堆分配(实时)的大小。我们可以在 XCode 工具中看到这些分配。我们如何通过代码获取这些信息?

我想要我的应用程序正在分配的 HEAP 中当前活动的对象大小..?我有常驻内存集信息,但这并不完整。

【问题讨论】:

    标签: c objective-c memory heap-memory


    【解决方案1】:

    对于 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;
    

    【讨论】:

    • 感谢您的回答。实际上我想获得我的整个应用程序分配大小。我问的一些全球性的东西,应用程序/程序的当前分配大小是多少?有什么办法吗?
    • @C_X 很抱歉,但您的问题被错误地问到,进程内存远不止是堆。在这种情况下,您正在寻找驻留集而不仅仅是堆:对于 Linux,请查阅 /proc/self/stat 中的字段 24,然后将其乘以 sysconf(_SC_PAGESIZE)。对于 OS X,task_info 将直接为您查询 RSS。
    • 感谢您的回复。不,我不希望那样,我有这些东西,但常驻内存并没有给出我的堆分配。实际上,常驻内存比您的实时分配要多得多。很抱歉,如果我不能让这更易于解释。
    • @C_X 那么你真正想要的是什么?您能否改写您的问题并说出您真正想要的内容?
    • 我正在使用本机 mach 方法来获取常驻内存和虚拟内存。但这不是解决方案。如果我开始计算分配的大小,有一种方法,但这还不够,然后我还计算了取消分配以获取驻留在堆中的活动对象。所以我一直在寻找一些对 c 或 Objective-c 有帮助的东西,它可以计算活动对象和大小。
    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多