【问题标题】:iOS8 , Xcode6 how to get memory usage programmatically as shown by XcodeiOS8,Xcode6 如何以编程方式获取内存使用情况,如 Xcode 所示
【发布时间】:2015-03-03 09:15:32
【问题描述】:

我正在使用以下方法来获取内存使用情况:

 struct task_basic_info info;
    mach_msg_type_number_t sizeNew = sizeof(info);
    kern_return_t kerr = task_info(mach_task_self(),
                                   TASK_BASIC_INFO,
                                   (task_info_t)&info,
                                   &sizeNew);
    if( kerr == KERN_SUCCESS ) {
        printf("Memory in use (in bytes): %u", info.resident_size);
    } else {
        printf("Error with task_info(): %s", mach_error_string(kerr));

    }

但是这个返回的内存比XCode6显示的要高很多,有没有人遇到同样的问题?

【问题讨论】:

    标签: xcode ios8 xcode6 64-bit


    【解决方案1】:

    驻留集大小 (RSIZE) 与“使用的内存量”相同。它也包含代码。

    您可能正在从top 程序中寻找RPRVT 的顶级等价物。

    获取该信息需要遍历该过程的 VM 信息。使用code for libtop.c, function libtop_update_vm_regions 作为模板,您需要遍历整个内存映射,将所有私有页面加起来。有一个更简单的例子walking the address space,可以作为计算这个大小的基础。您正在寻找 VPRVT 值,而不是 RPRVT 值。

    我目前没有 Mac 手头可以写出一个有任何信心的示例。

    【讨论】:

    • 嗨,是的,我也试过你的方法,但也有一个问题。- task_t task = mach_task_self(); while (true) { mach_msg_type_number_t count = VM_REGION_TOP_INFO_COUNT; myaddr += mysize; ret = vm_region_64(mytask, &myaddr, &mysize, VM_REGION_TOP_INFO, (vm_region_info_64_t)&myinfo, &mycount, &myobject_name); if (ret != KERN_SUCCESS) 中断; my_private_pages += myinfo.private_pages_resident; } int pageSize = getpagesize();
    • 现在,如果您看到 vmmemory 大小,它包含大小为 4K 的页面,即使是 64 位也是如此,其中 getMemorySize 返回大小为 16K 。
    • 所有基于 x86 架构的 32 位和 64 位 OSX 系统的标准页面为 4k。有大页面(2mb),但那些往往是在特殊情况下分配的。我不知道getMemorySize 或它的作用——根据一些谷歌搜索,它是第三方函数调用。 getpagesize() 应被视为“正确”值。 (正如我的回答中提到的,我的 Mac 目前正在维修,所以这一切都基于内存和谷歌;我自己无法直接检查)
    猜你喜欢
    • 2013-05-05
    • 2017-09-01
    • 2020-07-30
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多