Сколько памяти может использовать одно приложение для iOS?
... когда он находится на переднем плане.
Для оригинального iPad с 256 МБ ОЗУ я обнаружил, что мое приложение может использовать до 100-140 МБ, прежде чем оно будет убито.
Какая ситуация сейчас? Я мог бы пойти купить кучу iDevices и сделать сам тест, но я хотел проверить: кто-нибудь сделал тест?
Я понимаю, что у этого нет точного ответа, и я ищу диапазон, например: "Приложения убиты, когда они используют 300-350 МБ на устройстве с 512 МБ. Вы можете безопасно использовать до 300 МБ".
В частности:
-
На устройстве с 512 МБ памяти, сколько может использовать одно приложение?
-
На устройстве с памятью 1 ГБ, как можно использовать одно приложение?
-
Есть ли разница между вышеуказанным? Является ли каждое отдельное приложение ограниченным объемом памяти в интересах сохранения нескольких приложений в фоновом режиме или может использовать приложение переднего плана для вывода всех фоновых приложений из памяти и принимать все 1 ГБ (или 512 МБ) для себя (и OS, конечно)?
-
Имеет ли значение, является ли устройство iPad или iPhone? Если я подключу свое приложение к iPad с памятью 512 МБ, значит ли это, что он также будет работать на iPhone с 512 МБ памяти и наоборот? Я знаю, что UIViews и их базы поддержки Core Animation будут занимать больше памяти на iPad из-за большего размера экрана, но кроме этого, является ли ситуация с памятью одинаковой между iPhone и iPad с той же памятью?
Я имею в виду общую память, используемую процессом - кучу, стек, статические данные, код, резервные хранилища Core Animation и т.д.
Если вы склонны говорить, что это зависит от версии ОС, вы можете предположить, что мы говорим о iOS 7.
Я знаю, что использование слишком большого количества памяти означает, что когда мое приложение переходит в фоновый режим, iOS быстрее его завершает. Сейчас я в порядке с этим компромиссом.
Ответы
Ответ 1
Я написал тестовое приложение, которое измеряет, сколько памяти может выделить приложение, прежде чем оно будет убито. Вот цифры:
- iPhone 5s (iOS 10, режим отладки, 1 ГБ памяти): можно выделить 600 МБ
- iPad Air 2 (iOS 11.4, 2 ГБ памяти): 1,3 ГБ можно выделить
- iPhone X (iOS 11.4, 3 ГБ памяти): 1,2 ГБ можно выделить
- iPhone 7 Plus (iOS 12.1, 3 ГБ памяти): 1,8 ГБ можно выделить
- iPad 13 дюймов (iOS 11.4, 4 ГБ памяти): можно выделить 3 ГБ
Интересно, что я никогда не получал предупреждение памяти.
Вот код, если вы хотите запустить тест самостоятельно:
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
По состоянию на 2014 год мое минимальное аппаратное тестирование - это iPhone 4s, работающий под управлением iOS7 с установленными 50 приложениями. После перезагрузки ОС может освободить 200 МБ из общей суммы 512. После недели регулярного использования, лучше всего это может быть 100 МБ.
Я разрабатываю приложение Adobe AIR, которое не принимает предупреждения о низкой памяти из ОС. Если он приближается к пределу, он падает. Поэтому старайтесь оставаться под 100 МБ, если вы хотите запускать устройства с 512 МБ общего бара. Помните, что это связано с объединением gpu и cpu.
Ответ 3
Привет, я только что протестировал с моим приложением, для устройства с 512 МБ приложение будет аварийно завершено в любое время после использования 250 МБ, что даст вам проблему с "давлением памяти".