web-dev-qa-db-ja.com

1つのiOSアプリで使用できるメモリ量はどれくらいですか?

...フォアグラウンドにあるとき。

256MBのRAMを搭載した元のiPadの場合、アプリが強制終了される前に最大100〜140MBを使用できることがわかりました。

最近の状況はどうですか?たくさんのiDeviceを購入して自分でテストすることもできますが、確認したかったのは、誰かがテストを行ったことがありますか?

これには正確な答えがないことを理解しており、「512MBデバイスで300-350MBを使用するとアプリが強制終了されます。最大300MBまで安全に使用できます」などの範囲を探しています。

具体的には:

  1. 512MBのメモリを搭載したデバイスでは、1つのアプリでどれだけ使用できますか?

  2. 1GBのメモリを搭載したデバイスでは、1つのアプリでどのように使用できますか?

  3. 上記の間に違いはありますか?個々のアプリは、バックグラウンドでいくつかのアプリを保持するために一定量のメモリに制限されていますか、またはフォアグラウンドアプリがメモリからすべてのバックグラウンドアプリを開始し、1GB(または512MB)全体を自分自身に取り込むことができますか(およびOS、もちろん)?

  4. デバイスがiPadであるかiPhoneであるかは重要ですか? 512MBのメモリを搭載したiPadでアプリを動作させると、512MBのメモリを搭載したiPhoneでも動作しますが、逆の場合も同様ですか? UIViewとそのCore Animationバッキングストアは、画面サイズが大きいためにiPadでより多くのメモリを使用することを知っていますが、それ以外は、メモリの状況が同じメモリのiPhoneとiPadで同じですか?

ヒープ、スタック、静的データ、コード、Core Animationバッキングストアなど、プロセスで使用される合計メモリを指します。

OSのバージョンに依存すると言う傾向がある場合は、iOS 7について話していると想定できます。

メモリを使いすぎると、アプリがバックグラウンドになったときにiOSがより速く終了することを知っています。今のところ、このトレードオフに問題はありません。

38
Vaddadi Kartick

アプリが強制終了される前にどれだけのメモリを割り当てることができるかを測定するテストアプリを作成しました。数字は次のとおりです。

  • 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!")
    }
}

これはシミュレータでは機能しません。パフォーマンスに関することはすべてデバイスでテストする必要があります。

32
Vaddadi Kartick

2014年の時点で、私の最小のハードウェアテストデバイスは、iOS7を実行し、最大50個のアプリがインストールされたiPhone 4です。再起動後、OSは合計512個のうち200MBを解放できます。 1週間の定期的な使用の後、管理できる最高のものは100MBです。

OSからメモリ不足の警告を受け取らないAdobe AIRアプリを開発しています。限界に近づくとクラッシュします。 512 MBのRAMを搭載したデバイスで実行する場合は、100 MB未満にとどめてください。覚えておいてください、これはGPUとCPUを組み合わせたものです。

12
Sarah Northway

こんにちは、アプリでテストしたところ、512MBのデバイスの場合、250MBの使用後にアプリがクラッシュし、「メモリ不足」の問題が発生します。

8
Ajeet