Bir android uygulamasının yığın boyutu nasıl artırılır?


125

Birkaç 3B model kullanan bir Android uygulaması yazıyorum. Dokulu böyle bir model çok fazla bellek alabilir. Üreticinin bir uygulamanın kullanabileceği yığın boyutu için bir sınır belirlediğini öğrendim. Örneğin, tabletim Samsung Galaxy Tab 8.9 P7310 64MB bellek alabilir.

Bir uygulamanın kullanabileceği bu bellek boyutunu artırmanın bir yolu var mı?

Yanıtlar:


210

Android'i kullanabilirsiniz : largeHeap = "true" büyük bir yığın boyutu istemek kullanabilirsiniz, ancak bu Honeycomb öncesi cihazlarda çalışmayacaktır. 2.3 öncesi cihazlarda, VMRuntime sınıfını kullanabilirsiniz, ancak bu Gingerbread ve sonraki sürümlerde çalışmayacaktır.

Mümkün olduğu kadar büyük bir limite sahip olmanın tek yolu, NDK, SDK gibi hafıza limitleri koymadığından, NDK aracılığıyla hafıza yoğun görevler yapmaktır.

Alternatif olarak, kullanılmayan parçaları bellekten kaldırırken, modelin yalnızca o anda görüntülenen kısmını yükleyebilir ve gerisini ihtiyaç duyduğunuz kadar yükleyebilirsiniz. Ancak, uygulamanıza bağlı olarak bu mümkün olmayabilir.


NDK ilginç görünüyor. SDK ile yazılmış olan kodumla birlikte kullanabilir miyim?
cooxie

3
Bu tamamen sahip olduğunuz koda bağlıdır. NDK konusunda uzman değilim ve sadece temelleri biliyorum. Bu soruyu android-ndk Google grubundaki kodunuzun bir açıklamasıyla birlikte sormanızı veya buna özgü SO'da android-ndk etiketiyle yeni bir soru göndermenizi tavsiye ederim.
Raghav Sood

Acaba Unity3D'yi soruya daha spesifik bir cevap olarak kullanıp kullanamayacağımızı merak ediyorum ("birkaç 3D model kullanıyor") ... Birliğin NDK kullanıp kullanmadığına dair net bir kanıt bulamadık.
cregox

3
largeHeap=trueFTW
Luis Artola

2
android api'nin geliştiricileri gerçekten komik, daha fazla Heap istediğiniz gibi mi? Tamam isteyin, yalnızca ihtiyacı olanlar için ... bu arada her geliştirici, uygulama üretime geldiğinde eklenecek ilk şey olarak ekliyor :)
AndroidLover

110

Bir uygulamanın kullanabileceği bu bellek boyutunu artırmanın bir yolu var mı?

API Seviye 11+ üzerinde çalışan uygulamalar olabilir android:largeHeap="true"üzerinde <application>daha büyük bir normalden daha yığın boyutunu istemek için Manifestte eleman ve getLargeMemoryClass()üzerinde ActivityManageryığını olduğunu ne kadar büyük söyleyecektir. Ancak:

  1. Bu yalnızca API Seviye 11+ üzerinde çalışır (yani, Honeycomb ve ötesinde)

  2. Büyük yığının ne kadar büyük olacağına dair bir garanti yoktur

  3. Kullanıcı, büyük yığın isteğinizi algılayacaktır, çünkü diğer uygulamalarını RAM'in dışına çıkmaya zorlayacaktır, diğer uygulamaların işlemlerini büyük yığınınız tarafından kullanılmak üzere sistem RAM'ini boşaltmak için sonlandıracaktır.

  4. # 3 nedeniyle ve android:largeHeapbunun kötüye kullanılmasını beklediğim için , bunun için destek gelecekte iptal edilebilir veya kullanıcı yükleme sırasında bu konuda uyarılabilir (örneğin, bunun için özel bir izin istemeniz gerekir) )

  5. Şu anda, bu özellik hafifçe belgelenmiştir


@CommonsWare Eğer bir largeHeap'e sahip olmak mevcut değilse, önceden yüklenmiş nesneleri (resimler gibi) nasıl kaldırabilirim?
Jeongbebs

@MiguelRivera: Görüntüler için ideal olarak hafızalarını geri dönüştürürsünüz (bkz inBitmap. BitmapOptions). Bunun ötesinde, bunlara yönelik tüm referansları kaldırın ve sonunda çöp olarak toplanacaklar.
CommonsWare

ve hangi kararı öneriyorsun?
Gennadiy Ryabkin

@zest: Neyi kastettiğini bilmiyorum, üzgünüm.
CommonsWare

2
@Eftekhari: Uygulamanız için doğrudan değil. Daha fazla şeye sahip olmak, bu şeylerden geçmek için daha fazla CPU zamanı harcamanıza neden olabilir, ancak oradaki ayrıntılar, bellekle ne yaptığınıza bağlı olacaktır ve doğrudan talep ettiğinizle bağlantılı değildir android:largeHeap. Ancak, büyük bir yığın istemek, diğer uygulama işlemlerini aksi takdirde gerekenden daha erken sonlandırmaya zorlayarak genel olarak kullanıcı deneyimine zarar verebilir.
CommonsWare

22

yığın boyutunu dinamik olarak artıramazsınız.

android:largeHeap="true"Manifest'te kullanarak daha fazlasını kullanmayı isteyebilirsiniz .

ayrıca kullanabilirsiniz native memory (NDK & JNI) yığın boyutu sınırlamasını atlamak için .

işte bununla ilgili yaptığım bazı yazılar:

ve işte onun için yaptığım bir kitaplık:


@ uygulama başına java düzeyinde yığın sınırı var mı ve yerel farklı mı? yani s5 devcie 128mb java yığın sınırında örnek ve yerel başka 128 mb alabilir mi?
NitZRobotKoder

Yığın boyutu her uygulama için sabittir (boyut donanıma ve rom'a bağlıdır) ve herkes için aynı olmalıdır. Yerel bellek, aygıtın gerçek belleğidir, ancak bir kısmı işletim sistemi tarafından kullanıldığı için elbette sınırlıdır.
android geliştiricisi

Uygulamamın yerel .so + java android Platformu + java POJO mantığı + JavaScript kullanıp kullanmadığını kastettim. Android'in her seviyede farklı yığın boyutu var mı?
NitZRobotKoder


@NitZRobotKoder Hayır. Yığın boyutu, çok fazla kullanırsanız OOM istisnası alabileceğiniz Java / Kotlin dünyası içindir. Geri kalanı için, bu yerel hafızadır.
android geliştiricisi

6

İkinci işlemi kullanın. En beyan AndroidManifestYeni Serviceile

android:process=":second"

Birinci ve ikinci süreç arasındaki değişim bitti BroadcastReceiver


5

Bu, Android işletim sisteminize göre iki şekilde yapılabilir.

  1. Daha android:largeHeap="true"büyük bir yığın boyutu istemek için Android bildiriminin uygulama etiketini kullanabilirsiniz , ancak bu Honeycomb öncesi cihazlarda çalışmayacaktır.
  2. 2.3 öncesi cihazlarda, VMRuntime sınıfını kullanabilirsiniz , ancak bu, Gingerbread ve üzerinde çalışmaz Nasıl yapılacağını aşağıya bakın.
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

HeapSize'ı Ayarlamadan önce, diğer uygulamaları veya işletim sistemi işlevselliğini etkilemeyecek uygun boyutu girdiğinizden emin olun. Ayarlardan önce uygulamanızın ne kadar boyutta olduğunu kontrol edin ve ardından yalnızca işinizi yerine getirmek için boyutu ayarlayın. Çok fazla bellek kullanmayın, aksi takdirde diğer uygulamalar etkileyebilir.

Referans: http://dwij.co.in/increase-heap-size-of-android-application


4
Görünüşe göre, <2.3'ün bir yolu var ve> 2.3'ün bir yolu var, ancak 2.3'ün bir yolu var!
Michael

3

Hatırladığım kadarıyla kullanabileceğini VMRuntime ilk Android sürümlerinde sınıfı ama artık artık kullanamazsınız.

Geliştiricinin bir mobil ortamda yığın boyutunu seçmesine izin vermenin bu kadar güvenli olduğunu düşünmüyorum. Belirli bir aygıtta (programlama tarafında değil) yığın boyutunu değiştirmenin bir yolunu uygulamanın kendisinden değiştirmeye çalışarak bulmanın daha kolay olduğunu düşünüyorum.


0

Java Heap'i artırmak, açık mobil kaynakları haksız yere yiyor. Bazen sadece çöp toplayıcısını beklemek ve ardından yığın alanı azaldıktan sonra işlemlerinizi sürdürmek yeterlidir . O zaman bu statik yöntemi kullanın .

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.