iOS实际RAM和ProcessInfo.processinfo.physical -Memory稳定之间的差异



我正在研究一个需要在低内存设备上量身定制的应用程序。可用的设备内存将在Swift中给出:

ProcessInfo.processInfo.physicalMemory

例如:

  • iPhone SE提供2009.5 MB(2048 MB RAM(
  • iPhone 5s可提供1000.0 MB(1024 MB RAM(
  • iPhone 6提供989.0 MB(1024 MB RAM(
  • iPhone 6 提供977.0 MB(1024 MB RAM(
  • iPhone 4S可提供504.95 MB(512 MB RAM(

从我的理解中,三角洲分配给GPU并取决于屏幕大小。

我可以信任给定的设备始终给我相同的physicalMemory金额吗?

(例如,iPhone 6始终为989.0 MB(

看起来physicalMemorysysctlhw.physmem(或其MacOS等效(相同。

我能找到的最好的描述是从FreeBSD中的真实/物理/用户内存进行比较的帖子:

OS的"可用" RAM的量。这减去了启动rom/bioses/what-have-you保留的任何空间,以及对于(例如(AMD64上的FreeBSD-9,1 TB Direct-MAP限制(您必须用装载机手动照顾hw.physmem设置(。


这是"物理MEM"应该是的,并且主要是。如果您启动一台1.5 TB的机器,但OS限制为1 TB,hw.physmem应该为BIOS等1 TB减去。

因此,这是设备上的实际内存减去由不是iOS的事物保留的记忆。由于我们不能保证Apple不会更新这些系统,因此我们不能保证该应用程序可用的物理内存将被修复。因此,我不会硬编码这些魔术数字。您可以查看检索"真实"带有系统调用的内存大小,但是您也可以只使用内存桶,因为您知道物理始终将低于实际内存:

enum MemorySize {
    case low, medium, high
}
extension MemorySize {
    static var current: MemorySize {
        if ProcessInfo.processInfo.physicalMemory < 512 * 1024 * 1024 {
            return .low
        } else if ProcessInfo.processInfo.physicalMemory < 1024 * 1024 * 1024 {
            return .medium
        } else {
            return .high
        }
    }
}
...
if MemorySize.current == .low { /* Use low memory setup */ }

最新更新