iPhone OS 应用程序的可用内存

Posted

技术标签:

【中文标题】iPhone OS 应用程序的可用内存【英文标题】:Available memory for iPhone OS app 【发布时间】:2011-02-17 10:11:02 【问题描述】:

在 iPhone OS 中是否有定义应用程序可用内存量的函数或常量?

我正在寻找一种独立于设备(iPod touch、iPhone、iPad)的方式来了解应用程序还剩多少内存。

【问题讨论】:

【参考方案1】:

此函数将以字节为单位返回可用内存:

#import <mach/mach.h> 
#import <mach/mach_host.h>

natural_t  freeMemory(void) 
    mach_port_t           host_port = mach_host_self();
    mach_msg_type_number_t   host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
    vm_size_t               pagesize;
    vm_statistics_data_t     vm_stat;

    host_page_size(host_port, &pagesize);

    if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) NSLog(@"Failed to fetch vm statistics");

    natural_t   mem_used = (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count) * pagesize;
    natural_t   mem_free = vm_stat.free_count * pagesize;
    natural_t   mem_total = mem_used + mem_free;

    return mem_free;

【讨论】:

谢谢本。只是为了确认一下,您的解决方案是否使用任何私有 API?我应该导入哪些库才能使用它? 这很好@BenGottlieb,怎么会有这样的想法?你在这里做的代码,我从来没想过要做?太好了! 警告:根据经验,我认为 host_statistics() 报告的数字没有用 - 至少是可用/总内存。如果您进行一些谷歌搜索,您会发现更多人分享这种观点。【参考方案2】:

没有定义 iPhone 应用程序可以使用的最大内存量。您的应用是否会因内存不足而终止取决于操作系统使用的算法以及同时使用内存的其他应用(safari、邮件等)。

【讨论】:

如果内存不足,操作系统将根据需要终止 safari、邮件等线程。当内存不足时,您可以在控制台日志中看到这一点。 @hgpc,他找到如何找到可用*系统内存的方法,因为如果你继续分配,系统会为你释放更多,这不是一个确定的数字,如果你分配太多,你的进程被杀。据我了解,任何 iphone 应用程序都不应使用超过 30MB 的内存。 这仅供参考;系统将尝试为您清除内存,因此不应将此数字视为硬性规定。我主要用它来查看我正在使用多少内存;观察数字的波动,如果它开始可靠地下降,它可能表示内存泄漏,或者至少是资源占用。【参考方案3】:

以下 Swift 函数将以字节为单位返回系统的空闲内存 (RAM)。失败时返回 nil。

func systemFreeMemorySize() -> UInt?

    let HOST_VM_INFO_COUNT: mach_msg_type_number_t = mach_msg_type_number_t(sizeof(vm_statistics_data_t) / sizeof(integer_t))

    let host: host_t = mach_host_self()

    var pageSize: vm_size_t = vm_size_t()
    let hostPageSizeKernStatus: kern_return_t = host_page_size(host, &pageSize)
    guard hostPageSizeKernStatus == KERN_SUCCESS else 
        NSLog("Error with host_page_size(): " + (String.fromCString(mach_error_string(hostPageSizeKernStatus)) ?? "unknown error"))
        return nil
    

    var stats: vm_statistics_data_t = vm_statistics_data_t()
    var count: mach_msg_type_number_t = HOST_VM_INFO_COUNT

    let kernStatus: kern_return_t = withUnsafeMutablePointer(&stats) 
        return host_statistics(host, HOST_VM_INFO, host_info_t($0), &count)
    

    guard kernStatus == KERN_SUCCESS else 
        NSLog("Error with host_statistics(): " + (String.fromCString(mach_error_string(kernStatus)) ?? "unknown error"))
        return nil
    

    return UInt(stats.free_count) * UInt(pageSize)

【讨论】:

以上是关于iPhone OS 应用程序的可用内存的主要内容,如果未能解决你的问题,请参考以下文章

确定 JavaScript for iPhone Web 应用程序中可用的可用内存?

在开发设备上安装旧 iPhone OS

如何以编程方式在 iPhone 中查找可用内存?

iphone os 4.0以下是不是提供本地通知功能?

在 CocoaTouch (iPhone OS) 中,如何查找/消除 Instruments Leak 工具找不到的泄漏?

OS内核参数和JVM参数的调整