iPhone OS Bellek Uyarıları. Farklı Seviyeler Ne Anlama Geliyor?


85

İPhone OS cihazlarında bellek yönetiminin siyah sanatı ile ilgili olarak: farklı bellek uyarı seviyeleri ne anlama geliyor? Seviye 1? Seviye 2? Kadran 11'e mi gidiyor?

Bağlam: Kapsamlı bir bellek stres testi döneminden sonra - iPad uygulamamı iPod müzik çalar uygulaması çalarken çalıştırmak da dahil olmak üzere, aldığım rastgele ancak nadiren bellek uyarılarını görmezden gelme eğilimindeyim. Uygulamam asla çökmez. Hiç. Uygulamam sızdırmaz. Ve, mems uyarıları önemli görünmüyor.

Teşekkürler
Doug

Yanıtlar:


98

Temel olarak uyarılar, cihazın hafızasının azaldığı anlamına gelir ve "Lütfen hafızanın bir kısmını boşaltabilirseniz, aktif olarak kullanmadığınız harika olur ! " Bellek yönetiminiz sıkıysa ve pratik olarak atılabilecek nesneleriniz yoksa, mesajı iletin ve görmezden gelin.


25
LOL "Lütfen aktif olarak kullanmadığınız hafızanın bir kısmını boşaltabilirseniz harika olur!" Paha biçilmez ;-) Şerefe
dugla

15
İPhone OS çılgın hafıza dansının güler yüzlü bir ustası gibi konuşuyorsunuz.
dugla

193

Bellek seviyesi uyarıları, SpringBoard tarafından kaydedilir. Bir uygulama geliştiricisi olarak bunu önemsemenize gerek yok. Sadece yanıt vermek -{application}didReceiveMemoryWarningyeterli.


4 uyarı seviyesi vardır (0-3). Bunlar çekirdek bellek izleyicisinden ayarlanır ve halka açık olmayan işlevle elde edilebilirOSMemoryNotificationCurrentLevel() .

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

Seviyelerin nasıl tetiklendiği belgelenmemiştir. SpringBoard, her bellek seviyesinde aşağıdakileri yapacak şekilde yapılandırılmıştır:

  1. Uyarı (normal değil) - Posta gibi önemli olmayan arka plan uygulamalarının otomatik olarak yeniden başlatılmasını geciktirin veya yeniden başlatın.
  2. Acil - Safari ve iPod gibi tüm arka plan uygulamalarından çıkın.
  3. Kritik ve ötesi - Çekirdek devralacak, muhtemelen SpringBoard'u öldürecek veya hatta yeniden başlatılacak.

Etkin uygulamanın (jetsam) öldürülmesi SpringBoard tarafından değil, ancak launchd.


Bunun için teşekkürler. Bu soru üzerine komedyen Williham ile aranızda bir tartışma oldu. Mizah kazanır. Şerefe.
dugla

Merhaba, bende de aynı sorun var. Uygulamayı sürekli olarak 5 kereden fazla çalıştırdıktan sonra, Hafıza alındı ​​uyarısı alıyorum. 20 kez Seviye = 1, ancak uygulama kilitlenmiyor. Ancak bu mesajı aldığımda, Hafıza uyarısı alındı. Seviye = 2 uygulamam çöküyor. Seviye2, Seviye1'den sonra yaklaşık 20 kez ortaya çıkıyor. Uygulamamın çökmemesini nasıl sağlayabilirim? Teşekkürler
srikanth rongali

1
@Kenny: Daha az bellek, maksimum ne kadar kullanabiliriz demektir. Ne kadar canlı bayt alabiliriz? Çarpışma günlüğümde bunu buldum. Ücretsiz sayfalar: 371 Kablolu sayfalar: 12192 Temizlenebilir sayfalar: 0 En büyük süreç: DTMobileIS Bu ne anlama geliyor? Nereye bakmalıyım? Teşekkür ederim.
srikanth rongali

9
@srik: Yeni bir soru sorsan iyi olur .
kennytm

@kennytm: ios8 ile bu hala mümkün mü? Fonksiyonun içinde tanımlandığını gördüm libsystem_c.dylib. Devam edip onu kullanabilirsem harika olur. Teşekkürler
focs

12

Gönderen OSMemoryNotification.h ,

/*
** Threshold values for notifications
*/

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

toplam 5 seviye hafıza uyarısı (-1,3).

Hafıza Seviyesi uyarı açıklamasıyla ilgili olarak, @ KennyTM'nin cevabı mükemmel.

PM ve diğerlerine yardımcı olabilecek birkaç ilgili nokta eklemek istiyorum.


Bellek Seviyesi Uyarısı alırken ne yapmalısınız?

Bu uyarılardan herhangi birini aldığınızda, işleyici yönteminiz, gereksiz belleği hemen boşaltarak yanıt vermelidir. Örneğin, UIViewController sınıfının varsayılan davranışı, bu görünüm o anda görünür değilse, görünümünü temizlemektir; alt sınıflar, ek veri yapılarını temizleyerek varsayılan davranışı tamamlayabilir. Görüntü önbelleğini tutan bir uygulama, o anda ekranda olmayan herhangi bir görüntüyü serbest bırakarak yanıt verebilir.


Hafıza Seviyesi uyarısı nasıl gözlemlenir?

Gönderen http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

Sistem, uygulamanıza düşük bellek uyarısı gönderdiğinde hemen yanıt verin. iOS, boş bellek miktarı güvenli bir eşiğin altına düştüğünde çalışan tüm uygulamaları bilgilendirir. (Askıya alınan uygulamaları bilgilendirmez.) Uygulamanız bu uyarıyı alırsa, olabildiğince fazla bellek boşaltması gerekir. Bunu yapmanın en iyi yolu, önbelleklere, görüntü nesnelerine ve daha sonra yeniden oluşturulabilecek diğer veri nesnelerine yönelik güçlü referansları kaldırmaktır.

UIKit, aşağıdakiler dahil olmak üzere düşük bellek uyarılarını almanın birkaç yolunu sağlar:

  • ApplicationDidReceiveMemoryWarning: uygulamanızın temsilcisinin yöntemini uygulayın.
  • Özel UIViewController alt sınıfınızda didReceiveMemoryWarning yöntemini geçersiz kılın.
  • UIApplicationDidReceiveMemoryWarningNotification bildirimini almak için kaydolun.

Uygulamanızın Bellek Ayak İzini Nasıl Azaltabilirsiniz?

  • Bellek sızıntılarını ortadan kaldırın.
  • Kaynak dosyalarını olabildiğince küçük yapın.
  • Büyük veri kümeleri için Core Data veya SQLite kullanın.
  • Kaynakları tembel olarak yükleyin.
  • Başparmak seçeneğini kullanarak programınızı oluşturun.

Ayrıntılar http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html adresinde


Bellek akıllıca nasıl tahsis edilir?

  • Otomatik yayımlanan nesnelerin kullanımınızı azaltın : Otomatik referans sayma (ARC) ile nesneleri tahsis etmek / başlatmak ve derleyicinin bunları sizin için uygun zamanda serbest bırakmasına izin vermek daha iyidir. Bu, geçmişte mevcut yöntemin kapsamı dışında yaşamalarını önlemek için otomatik olarak yayımlamış olabileceğiniz geçici nesneler için bile geçerlidir.
  • Kaynaklara boyut sınırlamaları uygulayın : Daha küçük bir kaynak dosyası yapacağı zaman büyük bir kaynak dosyası yüklemekten kaçının. Yüksek çözünürlüklü bir görüntü kullanmak yerine, iOS tabanlı cihazlar için uygun boyutta bir görüntü kullanın. Büyük kaynak dosyaları kullanmanız gerekiyorsa, herhangi bir zamanda dosyanın yalnızca ihtiyacınız olan bölümünü yüklemenin yollarını bulun. Örneğin, tüm dosyayı belleğe yüklemek yerine, dosyanın bölümlerini belleğe ve belleğin dışına eşlemek için mmap ve munmap işlevlerini kullanın. Dosyaları belleğe eşleme hakkında daha fazla bilgi için.
  • Sınırsız problem setlerinden kaçının : Sınırsız problem setleri, hesaplamak için keyfi olarak büyük miktarda veri gerektirebilir. Set, mevcut olandan daha fazla bellek gerektiriyorsa, uygulamanız hesaplamaları tamamlayamayabilir. Uygulamalarınız mümkün olduğunda bu tür kümelerden kaçınmalı ve bilinen bellek sınırlarına sahip sorunlar üzerinde çalışmalıdır.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.