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

Posted

技术标签:

【中文标题】一个 iOS 应用程序可以使用多少内存?【英文标题】:How much memory can one iOS app use? 【发布时间】:2014-01-31 00:28:14 【问题描述】:

...当它在前台时。

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

现在是什么情况?我可以去买一堆 iDevices 自己做一个测试,但我想检查一下:有人做过测试吗?

我知道这没有准确的答案,我正在寻找一个范围,例如:“应用程序在 512MB 设备上使用 300-350MB 时会被终止。您最多可以安全地使用 300MB。”

具体来说:

    在 512MB 内存的设备上,一个应用可以使用多少?

    在1GB内存的设备上,一个应用怎么能用?

    以上有区别吗?是否每个单独的应用程序都限制在固定数量的内存中以便将一些应用程序保留在后台,或者前台应用程序是否可以从内存中踢出所有后台应用程序,并将整个 1GB(或 512MB)留给它自己(以及操作系统,当然)?

    设备是 iPad 还是 iPhone 是否重要?如果我的应用程序可以在内存为 512MB 的 iPad 上运行,是否意味着它也可以在内存为 512MB 的 iPhone 上运行,反之亦然?我知道 UIViews 和它们的 Core Animation 后备存储会因为更大的屏幕尺寸而在 iPad 上占用更多内存,但除此之外,具有相同内存的 iPhone 和 iPad 之间的内存情况是否相同?

我指的是进程使用的总内存——堆、堆栈、静态数据、代码、Core Animation 后备存储等。

如果您倾向于说它取决于操作系统版本,您可以假设我们谈论的是 ios 7。

我知道使用太多内存意味着当我的应用程序进入后台时,iOS 会更快地终止它。我现在可以接受这种权衡。

【问题讨论】:

这不是真的。对于具有 256MB RAM 的原始 iPad,我发现我的应用在被杀死之前最多可以使用 100-140MB。 即使它是真的,也不会成为一个糟糕的问题。在这种情况下,“Apple 以外的人都不知道”将是一个答案。 @HotLicks 我没有说我在寻找一个准确的答案。正如我在对 xcodeNoob 的回答的评论中所说的那样,一个范围就可以了。喜欢:512MB 设备上的 350-400MB。我在澄清这个问题。 HotLicks 是正确的,没有人知道确切的答案。从我过去读过的所有帖子中,我大胆猜测你可以使用 10% 作为一个粗略的数字。如果您使用延迟加载和其他此类技术,则无论如何都不应该太接近该数字。 @Kartick 这是一个非常有效的问题,您的回答非常棒。通读这篇文章对我很有帮助,因为我看到我的应用程序在最近一次迭代后刚刚从 86 MB 跃升至 136 MB。我已决定将目标保持在 100 MB 左右——这将使我保持精简,并在我想为 Apple Watch 或 tvOS 修改我的应用程序时更快地调整。 【参考方案1】:

您好,我刚刚用我的应用进行了测试,对于 512MB 的设备,应用在使用 250MB 后随时会崩溃,出现“内存压力”问题。

【讨论】:

【参考方案2】:

截至 2014 年,我的最低硬件测试设备是运行 iOS7 并安装了大约 50 个应用程序的 iPhone 4s。重新启动后,操作系统可以释放总共 512 个内存中的 200mb。正常使用一周后,它可以管理的最佳容量是 100mb。

我正在开发一个 Adob​​e AIR 应用程序,它不会收到来自操作系统的内存不足警告。如果它接近极限,它就会崩溃。因此,如果您想在总内存为 512mb 的设备上运行,请尽量保持在 100mb 以下。请记住,这是针对 gpu 和 cpu 的组合。

【讨论】:

cpu gpu和ram有什么关系? 通常图形纹理存储在显卡内存中的 GPU 内存中,但 iOS 设备使用统一内存架构并将其纹理存储在 CPU 内存中。 apple.stackexchange.com/questions/54977/…【参考方案3】:

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

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 13 英寸 iPad(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!")
    

这在模拟器上不起作用。任何有关性能的内容都应在设备上进行测试。

【讨论】:

它似乎是设备内存容量的 60-70% 左右。 这也适用于模拟器吗? (我在 iOS12 的 iPhone SE 模拟器上运行它,它超过了 25GB,我手动停止了它)【参考方案4】:

如果其他人感兴趣:

在具有 6 GB RAM (AFAIK) 的 iPhone 12 Pro 上,它在终止之前分配了 2800 MB(几乎一半)。 YMMV

【讨论】:

以上是关于一个 iOS 应用程序可以使用多少内存?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用程序可以分配多少内存?

ios运行时内存限制

iOS 应用程序可以泄漏的最大内存量

在 MonoTouch 应用程序中查看内存使用情况

Redis线程IO模型的秘密知多少

iOS缓存(转)