LargeHeap'i true olarak ayarlamanın avantajları nelerdir?


122

android:largeHeap="true"Aşağıda görülebileceği gibi, belirlediğim neredeyse 50 sınıfa sahip bir Uygulamam var . Bu iyi bir uygulama mı?

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="Mall"
        android:largeHeap="true"
        android:logo="@drawable/logo_for_up"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme" >
</application>

Lütfen kullanmak için avantaj ve dezavantajları önerin.

Hafıza sorunları yaşıyorum, bu yüzden bu soruyu soruyorum.


3dmodel oyunları vb. gibi uygulamanız için büyük bir belleğe ihtiyacınız varsa
januprasad

47
50 sınıf o kadar çok değil.
Chris Hayes


Uygulamanızın içinde bellek tüketen bir hizmet veya başka bir uygulama uygulaması kullanıyorsanız, uygulamanızda, uygulamayı kullanırken en yaygın sorun geliştiricinin yüzü veya bellek veya statik tüketen çok sayıda değişkeniniz varsa, uygulamanızın bellek sorunu olacaktır. değişken de bunun nedeni olabilir.
Aditi

4
Sınıfların sayısı önemli değil. Genellikle çok fazla bellek alan şey bit eşlemlerdir. Bkz. " Belleğe Aşağı Ölçekli Sürüm Yükleme ".
ToolmakerSteve

Yanıtlar:


116

Buradaki parti için çok geç ama yine de 0.02 dolarımı teklif edeceğim.
Bunu android:largeHeap="true" açıklayan Google'dan alıntıyı kullanmak iyi bir fikir değil,

Bununla birlikte, büyük bir yığın isteme yeteneği, yalnızca daha fazla RAM tüketme ihtiyacını (büyük bir fotoğraf düzenleme uygulaması gibi) haklı çıkarabilecek küçük bir uygulama kümesine yöneliktir. Hiçbir zaman büyük bir yığın istemeyin çünkü belleğiniz tükendi ve hızlı bir düzeltmeye ihtiyacınız var — bunu yalnızca tüm belleğinizin tam olarak nereye tahsis edildiğini ve neden saklanması gerektiğini bildiğinizde kullanmalısınız. Yine de, uygulamanızın büyük yığını haklı çıkarabileceğinden emin olsanız bile, mümkün olduğunca onu talep etmekten kaçınmalısınız. Ekstra belleğin kullanılması, genel kullanıcı deneyiminin zararına gittikçe daha fazla zarar verecektir çünkü çöp toplama daha uzun sürecek ve görev değiştirme veya diğer genel işlemleri gerçekleştirirken sistem performansı daha yavaş olabilir.

işte belgelerin tam bağlantısı https://developer.android.com/training/articles/memory.html

GÜNCELLEME

İle heyecan verici bir şekilde çalıştıktan sonra out of memory errors, oom sorununu önlemek için bunu manifestoya eklemenin bir günah olmadığını söyleyebilirim, ayrıca @ Milad'ın aşağıda belirttiği gibi uygulamanın normal çalışmasını etkilemiyor

GÜNCELLEME 2

İşte birkaçı başa ipuçları ileout of memory errors

1) o verir android bu geri arama kullanın onLowMemory, onTrimMemory(int) ve (picasso, süzülme, fresk ....) onlar hakkında daha fazla bilgi bulabilirsiniz şekilde resmin önbelleğini temizleyin burada ve burada
2) dosyalarınızı (resim, pdf) sıkıştırmak
3) hakkında okumak burada bitmap nasıl daha verimli kullanılır?
4) Kodun şık ve hacimli olmadığından emin olmak için üretim zorlamadan önce düzenli olarak tiftik kullanın


1
Neden "uygulamanın normal çalışmasını etkilemiyor" diyorsunuz? Bu cevap bazı sonuçları tartışıyor. Başka yerlerde, bazı uygulamalarda largeHeap GC için daha da kötü zamanlamanın ölçüldüğünü gördüm.
ToolmakerSteve

59

Bunun çok etkili bir soru olduğunu düşünüyorum ve bu seçeneği kullanmanın avantajları ve dezavantajları hakkında bazı ayrıntılar eklememe izin verin.

Ne Alırsınız:

  • Açıkçası, daha büyük bir yığın elde edersiniz, bu da riski azaltmak anlamına gelir OutOfMemoryError.

Ne Kaybettiğiniz:

  • Görünür bir takılmaya neden olabilecek bazı çerçeveleri kaybedebilirsiniz . Daha büyük yığın, çöp toplama işlemlerinin daha uzun sürmesine neden olur. Çünkü çöp toplayıcı temelde tüm canlı nesne kümenizi geçmek zorundadır. Genellikle, çöp toplama duraklama süresi yaklaşık 5 ms'dir ve birkaç milisaniyenin önemli olmadığını düşünebilirsiniz. Ama her milisaniye önemlidir. Android cihaz her 16 ms'de bir ekranını güncellemelidir ve daha uzun GC süresi, çerçeve işleme sürenizi 16 milisaniye engelini aşabilir ve bu da görünür bir takılmaya neden olabilir.

  • Ayrıca uygulama değiştirmek daha yavaş olacaktır . Android sistemi, en son kullanılan işlemden başlayarak LRU önbelleğindeki işlemleri öldürebilir, ancak aynı zamanda hangi işlemlerin en çok bellek yoğun olduğu konusunda da biraz düşünebilir. Dolayısıyla, daha büyük yığın kullanırsanız, işleminizin arka planda kaldığında ölme olasılığı daha yüksektir, bu da kullanıcıların diğer uygulamalardan sizinkine geçmek istemesinin daha uzun zaman alabileceği anlamına gelir. Ayrıca, uygulamanız daha büyük bellek gerektirdiğinden, diğer arka planlı süreçler, süreciniz ön plandayken atılma olasılığı daha yüksektir. Bu, uygulamanızdan diğer uygulamalara geçişin de daha uzun süreceği anlamına gelir.

Sonuç:

largeHeapSeçeneği mümkün olduğunca kullanmaktan kaçının . Fark edilmesi zor performans düşüşüne ve kötü kullanıcı deneyimine mal olabilir.


17

Neredeyse 50 derslik bir Uygulamam var

Bunun pek sorun yarattığını sanmıyorum. OutOfMemory hatası almanızın nedeni, genellikle uygulamanıza çok fazla resim veya bunun gibi bir şey yüklemektir. Büyük yığın kullanmaktan memnun değilseniz, bellek kullanımını optimize etmenin bir yolunu bulmalısınız.

Picasso , UIL veya Glide gibi Görüntü Yükleme Kitaplıklarını da kullanabilirsiniz . Hepsi bellekte ve / veya diskte görüntü önbelleğe alma özelliğine sahiptir.


1
resim yükleme için genellikle picaso veya evrensel resim yükleyiciyi
öneririm

5
Süzülme Picasso'dan daha iyi ve biraz daha optimize edilmiş
Damien Praca

1
@DamienPraca Sanmıyorum, en azından Picasso'da etiketleri (setTag (), pauseTag (), resumeTag ()) doğru kullanırsanız.
Ruslan Berozov

15

Aslında android: largeHeap , ayrılan belleğinizi uygulamaya artırmak için kullanılan bir araçtır.

Bu bayrağı kullanma ihtiyacının net bir tanımı yoktur. Daha fazla belleğe ihtiyacınız varsa - Android, belleği artırmanız için size bir araç sağlar. Ama kullanmanın gerekliliği, kendinizi tanımlarsınız.


4
evet net bir tanım var bu bağlantıya yönlendirin developer.android.com/training/articles/memory.html
Mightian

2
@war_Hero - belki bu makale içeriğini değiştirmiştir? İçinde largeHeap'ten bahsedilmiyor.
ToolmakerSteve

7

Eğer varsa gereken bellek büyük miktarda kullanmak (ve korumak), o zaman evet, sen ve kullanmalıdır edebilirsinizandroid:largeHeap="true" . Ancak bunu kullanırsanız, diğer uygulamalar ön plandayken uygulamanızın bellekten temizlenmesine hazırlıklı olmalısınız.

"Hazırlıklı olun" derken, bu olasılığa göre tasarlamanız gerektiğini kastediyorum, böylece sizin onStop()ve onResume()yöntemleriniz mümkün olduğunca verimli bir şekilde yazılırken, tüm ilgili durumun kaydedilmesini ve kullanıcıya kusursuz bir görünüm sunacak şekilde geri yüklenmesini sağlar.

Orada bu parametre ile ilgili üç yöntem vardır: maxMemory(), getMemoryClass(), ve getLargeMemoryClass().

Çoğu cihaz maxMemory()için benzer bir değeri temsil edergetMemoryClass() ikincisi megabayt cinsinden ifade edilse de, birincisi bayt cinsinden ifade edilse de, varsayılan olarak .

largeHeapParametreyi kullandığınızda, maxMemory()cihaza özgü daha yüksek bir seviyeye yükseltilirken getMemoryClass()aynı kalacaktır.

getMemoryClass()yığın boyutunuzu sınırlamaz, ancak uygulamanızın üzerinde çalıştığınız belirli cihazın sınırları dahilinde rahat ve uyumlu bir şekilde çalışmasını istiyorsanız kullanmanız gereken yığın miktarını söyler .

maxMemory()Buna karşılık, yok senin yığın boyutunu sınırlamak ve değerini artırarak yoluyla ek yığınına kazanç erişim yapmak ve böylece largeHeapo değeri artar. Ancak, artan yığın miktarı hala sınırlıdır ve bu sınır cihaza özel olacaktır, bu da uygulamanızın çalıştığı cihazın kaynaklarına bağlı olarak uygulamanız için kullanılabilen yığın miktarının değişeceği anlamına gelir. Bu nedenle, kullanmak largeHeap, uygulamanızın tüm tedbirlerden vazgeçmesi ve yiyebildiğiniz kadar yiyebileceğiniz büfede yolunu bulması için bir davet değildir.

Uygulamanız largeHeap, yöntemi çağırarak parametreyi kullanarak belirli bir cihazda tam olarak ne kadar bellek kullanılabilir hale getirileceğini keşfedebilir getLargeMemoryClass(). Döndürülen değer megabayt cinsindendir.

Bu önceki gönderi, largeHeapparametrenin bir tartışmasının yanı sıra, birkaç belirli Android cihazında kullanımıyla ve kullanılmadan ne kadar yığın kullanılabilir hale getirildiğine dair birkaç örnek içerir:

Android'de uygulama yığın boyutunu algıla

Bu parametre true olarak ayarlandığında kendi uygulamalarımdan hiçbirini dağıtmadım. Ancak, uygulamalarımdan birinde, yalnızca geliştirme sırasında çalışan bir dizi optimizasyonla ilgili parametreyi derlemek için yoğun bellek kullanan bir kod var. largeHeapBu kodu çalıştırırken yetersiz bellek hatalarını önlemek için parametreyi yalnızca geliştirme sırasında ekliyorum . Ancak uygulamayı dağıtmadan önce parametreyi (ve kodu) kaldırıyorum.


1
"tüm tedbirleri bir kenara bırakın ve yiyebildiğiniz kadar yiyebileceğiniz açık büfeye göz atın " 😂
Joshua Pinter

4

Uygulamanızın süreçlerinin büyük bir Dalvik yığınıyla oluşturulup oluşturulmayacağı. Bu, uygulama için oluşturulan tüm işlemler için geçerlidir. Yalnızca bir işleme yüklenen ilk uygulama için geçerlidir; Birden çok uygulamanın bir işlemi kullanmasına izin vermek için paylaşılan bir kullanıcı kimliği kullanıyorsanız, bunların tümü bu seçeneği tutarlı bir şekilde kullanmalıdır, aksi takdirde tahmin edilemeyen sonuçları olacaktır.

Çoğu uygulamanın buna ihtiyacı olmamalı ve bunun yerine gelişmiş performans için genel bellek kullanımlarını azaltmaya odaklanmalıdır. Bunun etkinleştirilmesi ayrıca kullanılabilir bellekte sabit bir artışı garanti etmez, çünkü bazı aygıtlar toplam kullanılabilir bellekleri ile sınırlı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.