一个iOS应用可以使用多少内存?

50

当应用在前台时,可以使用更多的内存。

对于拥有256MB RAM的原始iPad,我发现我的应用程序在被杀死之前最多可以使用100-140MB的内存。

现在的情况如何?我可以去购买一堆i设备进行测试,但我想确认:是否有人做过测试?

我知道这个问题没有确切的答案,我正在寻找一个范围,例如:“当应用在512MB设备上使用300-350MB时,应用将被杀死。您可以安全地使用高达300MB的内存。”

具体来说:

  1. 在拥有512MB内存的设备上,一个应用程序可以使用多少内存?

  2. 在拥有1GB内存的设备上,一个应用程序可以使用多少内存?

  3. 上述两者之间有区别吗?为了在后台保留几个应用程序,每个单独的应用程序是否受到固定数量的内存限制,或者可以通过将前台应用程序从内存中清除所有后台应用程序,并占用全部1GB(或512MB)的内存(和操作系统,当然)?

  4. 设备是iPad还是iPhone是否重要?如果我的应用程序在拥有512MB内存的iPad上正常工作,这是否意味着它也将在拥有512MB内存的iPhone上工作,反之亦然?我知道UIView及其核心动画后备存储将因屏幕尺寸较大而占用更多内存,在除此以外的情况下,iPhone和iPad之间的内存情况是否相同?

我指的是进程使用的总内存--堆,栈,静态数据,代码,核心动画后备存储等。

如果您倾向于说这取决于操作系统版本,则可以假设我们正在讨论iOS 7。

我知道使用太多内存意味着当我的应用程序进入后台时,iOS会更快地终止它。目前对于这种权衡我感到满意。


2
这不是真的。对于原始的iPad,配备了256MB的RAM,我发现我的应用程序在被杀死之前最多可以使用100-140MB。 - Kartick Vaddadi
3
即使这是真的,这也不会使它成为一个坏问题。在这种情况下,“没有人知道苹果公司之外的情况”将是一个答案。 - Kartick Vaddadi
HotLicks说得没错,没有人知道确切的答案。从我过去阅读的所有帖子中,我敢猜测你可以使用10%作为一个大概的数字。如果你使用懒加载和其他类似的技术,你应该永远不会接近那个数字。 - sangony
iOS会根据前台应用的需要清除后台应用吗?这意味着在一个1GB的设备上,我可以使用1GB-操作系统所需的内存。由于操作系统所需的内存必须小于400M(否则,iOS 7无法在512M的设备上运行),这意味着在具有1G RAM的设备上保证有600M可用。正确吗? - Kartick Vaddadi
2
@Kartick 这是一个非常合理的问题,你的回答非常棒。阅读这篇文章对我非常有帮助,因为我最近发现我的应用程序从86 MB跳到了136 MB。我决定设定一个目标,保持在100 MB左右 - 这将使我更加精简,并且如果我想要修改我的应用程序以适应Apple Watch或tvOS,也能更快地转变方向。 - Sergi
显示剩余7条评论
4个回答

50

我编写了一个测试应用程序,可以测量在被杀之前应用程序可以分配多少内存。以下是数字:

  • iPhone 5s(iOS 10,调试模式,1GB内存):可以分配600MB
  • iPad Air 2(iOS 11.4,2GB内存):可以分配1.3GB
  • iPhone X(iOS 11.4,3GB内存):可以分配1.2GB
  • iPhone 7 Plus(iOS 12.1,3GB内存):可以分配1.8GB
  • iPad 13英寸(iOS 11.4,4GB内存):可以分配3GB

有趣的是,我从未收到过内存警告。

如果您想运行测试,以下是代码:

import UIKit

let sizeInMb = 100

class Wrapper {
  var array = [UInt8](repeating: 0, count: sizeInMb * 1048576)  // 100 MB
}

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow(frame: UIScreen.main.bounds)

        var i = 0

        sleep(5)  // So that you can see how much memory it consumes before any allocations.

        while true {
            let w = Wrapper()
            Unmanaged<Wrapper>.passRetained(w)
            i += 1
            print("\(i * sizeInMb) MB allocated")
            sleep(1)  // Give the OS a chance to kill other processes.
        }

        return true
    }

    func applicationDidReceiveMemoryWarning(_ application: UIApplication) {
        print("Memory warning!")
    }
}

模拟器上无法使用此功能。与性能相关的任何内容都应在设备上进行测试。


2
似乎占据了设备大约60-70%的内存容量。 - Hlung
这个也能在模拟器上运行吗?(我在iOS12的iPhone SE模拟器上运行了一下,它占用了超过25GB的空间,我手动停止了它) - Ahmadreza

12

截至2014年,我的最小硬件测试设备是运行iOS7的iPhone 4s,安装了大约50个应用程序。在重新启动后,操作系统可以释放512MB总内存中的200MB。经过一周的常规使用,它最好的管理能力是100MB。

我正在开发一个Adobe AIR应用程序,该应用程序不会从操作系统接收低内存警告。如果接近限制,它会崩溃。因此,如果要在总RAM为512MB的设备上运行,请尝试保持在100MB以下。请记住,这是针对GPU和CPU的总和。


CPU、GPU和RAM之间有什么关系? - Esqarrouth
4
通常,图形纹理存储在GPU内存中的显卡上,但是iOS设备使用统一内存架构并将纹理存储在CPU内存中。http://apple.stackexchange.com/questions/54977/how-much-gpu-memory-do-iphones-and-ipads-have - Sarah Northway

9

你好,我刚刚测试了我的应用,在一个512MB的设备上,当使用量超过250MB时,应用程序将崩溃并显示"内存压力"问题。


2
如果对其他人有兴趣的话,我可以提供一些信息:
在iPhone 12 Pro上,配备了6GB的RAM(据我所知),在被终止之前,它会分配2800 MB(接近一半)的内存。结果可能因人而异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接