Bagaimana cara meningkatkan ukuran tumpukan aplikasi android?

125

Saya menulis aplikasi Android yang menggunakan beberapa model 3D. Model dengan tekstur seperti itu bisa menghabiskan banyak memori. Saya menemukan pabrikan menetapkan batas ukuran tumpukan aplikasi yang dapat digunakan. Misalnya tablet saya Samsung Galaxy Tab 8.9 P7310 dapat mengambil 64MB memori.

Apakah ada cara untuk meningkatkan ukuran memori ini yang dapat digunakan aplikasi?

cooxie
sumber

Jawaban:

210

Anda dapat menggunakan android: largeHeap = "true" untuk meminta ukuran heap yang lebih besar, tetapi ini tidak akan berfungsi pada perangkat Honeycomb pra apa pun. Pada perangkat pra 2.3, Anda dapat menggunakan kelas VMRuntime, tetapi ini tidak akan bekerja pada Gingerbread dan di atasnya.

Satu-satunya cara untuk memiliki batas sebesar mungkin adalah dengan melakukan tugas-tugas intensif memori melalui NDK, karena NDK tidak memaksakan batas memori seperti SDK.

Atau, Anda hanya dapat memuat bagian model yang saat ini dalam tampilan, dan memuat sisanya sesuai kebutuhan, sambil melepaskan bagian-bagian yang tidak digunakan dari memori. Namun, ini mungkin tidak mungkin, tergantung pada aplikasi Anda.

Raghav Sood
sumber
NDK terlihat menarik. Bisakah saya menggunakannya dalam kombinasi dengan kode saya sudah ditulis dengan SDK?
cooxie
3
Itu sepenuhnya tergantung pada kode apa yang Anda miliki. Saya bukan ahli dengan NDK, dan hanya tahu dasar-dasarnya. Saya akan merekomendasikan Anda mengajukan pertanyaan ini bersama dengan deskripsi kode Anda di grup Google android-ndk, atau memposting pertanyaan baru pada SO khusus untuk ini dengan tag android-ndk.
Raghav Sood
Saya ingin tahu apakah kita tidak dapat "secara sederhana" menggunakan Unity3D sebagai jawaban yang lebih spesifik untuk pertanyaan ("menggunakan beberapa model 3D") ... Tidak dapat dengan cepat menemukan bukti yang jelas tentang apakah persatuan memang menggunakan NDK.
cregox
3
largeHeap=trueFTW
Luis Artola
2
para pengembang android api benar-benar lucu, mereka seperti kamu ingin lebih banyak Heap? Ok minta itu, itu hanya untuk mereka yang membutuhkannya ... sementara itu setiap pengembang menambahkannya sebagai hal pertama yang ditambahkan ketika aplikasi datang ke produksi :)
AndroidLover
110

Apakah ada cara untuk meningkatkan ukuran memori ini yang dapat digunakan aplikasi?

Aplikasi yang berjalan di API Level 11+ dapat memiliki android:largeHeap="true"pada <application>elemen di manifes untuk meminta ukuran heap yang lebih besar dari normal, dan getLargeMemoryClass()pada ActivityManagerakan memberi tahu Anda seberapa besar heap itu. Namun:

  1. Ini hanya berfungsi pada API Level 11+ (yaitu, Honeycomb dan lebih tinggi)

  2. Tidak ada jaminan seberapa besar tumpukan besar itu

  3. Pengguna akan melihat permintaan tumpukan besar Anda, karena itu akan memaksa aplikasi lain mereka keluar dari RAM mengakhiri proses aplikasi lain untuk membebaskan RAM sistem untuk digunakan oleh tumpukan besar Anda

  4. Karena # 3, dan fakta bahwa saya berharap android:largeHeapakan disalahgunakan, dukungan untuk ini dapat ditinggalkan di masa depan, atau pengguna mungkin diperingatkan tentang ini pada waktu pemasangan (misalnya, Anda perlu meminta izin khusus untuk itu )

  5. Saat ini, fitur ini didokumentasikan secara ringan

CommonsWare
sumber
@CommonsWare jika memiliki bigHeap tidak tersedia, bagaimana saya bisa menghapus objek yang sebelumnya dimuat (seperti gambar)?
Jeongbebs
@MiguelRivera: Untuk gambar, idealnya Anda mendaur ulang memori mereka (lihat inBitmapdi BitmapOptions). Di luar itu, hapus semua referensi kepada mereka, dan akhirnya mereka akan mengumpulkan sampah.
CommonsWare
dan keputusan apa yang Anda sarankan?
Gennadiy Ryabkin
@est: Saya tidak tahu apa yang Anda maksud, maaf.
CommonsWare
2
@Eftekhari: Tidak secara langsung, untuk aplikasi Anda. Memiliki lebih banyak barang dapat menyebabkan Anda menghabiskan lebih banyak waktu CPU untuk melakukan hal-hal tersebut, tetapi detail di sana akan tergantung pada apa yang Anda lakukan dengan memori dan tidak secara langsung terkait dengan yang diminta android:largeHeap. Namun, meminta tumpukan besar dapat membahayakan pengalaman pengguna secara keseluruhan, dengan memaksa proses aplikasi lain untuk mengakhiri lebih awal dari yang seharusnya diperlukan.
CommonsWare
22

Anda tidak dapat meningkatkan ukuran tumpukan secara dinamis.

Anda dapat meminta untuk menggunakan lebih banyak dengan menggunakan android:largeHeap="true"dalam manifes.

juga, Anda dapat menggunakan native memory (NDK & JNI), sehingga Anda benar-benar melewati batasan ukuran tumpukan.

berikut adalah beberapa posting yang saya buat tentang itu:

dan inilah perpustakaan yang telah saya buat untuk itu:

pengembang android
sumber
@ per aplikasi apakah batas tumpukan di tingkat java dan asli berbeda? contoh yaitu pada s5 devcie 128mb batas heap java dan asli dapat mengambil another128 mb?
NitZRobotKoder
Ukuran tumpukan konstan untuk setiap aplikasi (ukuran tergantung pada perangkat keras dan rom) dan harus sama untuk semua. Memori asli adalah perangkat yang asli, tetapi tentu saja terbatas juga, karena beberapa digunakan oleh OS.
pengembang android
maksud saya jika aplikasi saya menggunakan say native .so + java android Platform + java POJO logic + JavaScript. Apakah Android memiliki ukuran tumpukan berbeda di setiap level?
NitZRobotKoder
@NitZRobotKoder No. Ukuran heap adalah untuk dunia Java / Kotlin, di mana Anda bisa mendapatkan pengecualian OOM jika Anda menggunakan terlalu banyak. Selebihnya, itu adalah memori asli.
Android developer
6

Gunakan proses kedua. Nyatakan AndroidManifestbaru Servicedengan

android:process=":second"

Pertukaran antara proses pertama dan kedua berakhir BroadcastReceiver

Yura Shinkarev
sumber
5

Ini dapat dilakukan dengan dua cara sesuai dengan OS Android Anda.

  1. Anda dapat menggunakan android:largeHeap="true"tag aplikasi manifes Android untuk meminta ukuran tumpukan yang lebih besar, tetapi ini tidak akan berfungsi pada perangkat Honeycomb pra.
  2. Pada perangkat pra 2.3, Anda dapat menggunakan kelas VMRuntime , tetapi ini tidak akan bekerja pada Gingerbread dan di atas. Lihat di bawah ini bagaimana melakukannya.
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

Sebelum Mengatur HeapSize pastikan Anda telah memasukkan ukuran yang sesuai yang tidak akan memengaruhi fungsionalitas aplikasi atau OS lainnya. Sebelum pengaturan, periksa berapa ukuran aplikasi Anda & atur ukuran hanya untuk memenuhi pekerjaan Anda. Jangan menggunakan terlalu banyak memori karena aplikasi lain mungkin akan mempengaruhi.

Referensi: http://dwij.co.in/increase-heap-size-of-android-aplikasi

Pengembang Web di Pune
sumber
4
Jadi rupanya, <2.3 memiliki cara, dan> 2.3 memiliki cara, tetapi 2.3 kacau!
Michael
3

Dari yang saya ingat Anda bisa menggunakan VMRuntimekelas di versi Android awal tetapi sekarang Anda tidak bisa lagi.

Saya tidak berpikir membiarkan pengembang memilih ukuran tumpukan di lingkungan seluler dapat dianggap sangat aman. Saya pikir itu lebih mudah bahwa Anda dapat menemukan cara untuk mengubah ukuran tumpukan di perangkat tertentu (bukan pada sisi pemrograman) dengan mencoba memodifikasinya dari aplikasi itu sendiri.

Mendongkrak
sumber
0

Meningkatkan Java Heap secara tidak adil memakan kebangkitan ponsel yang defisit. Terkadang cukup untuk hanya menunggu pengumpul sampah dan kemudian melanjutkan operasi Anda setelah ruang tumpukan berkurang. Gunakan metode statis ini .

Zon
sumber