Apa keuntungan menyetel largeHeap menjadi true?

122

Saya memiliki Aplikasi dengan hampir 50 kelas yang saya atur android:largeHeap="true", seperti yang dapat dilihat di bawah. Apakah ini praktik yang baik?

<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>

Mohon sarankan keuntungan dan kerugian untuk menggunakannya.

Saya mengalami masalah memori, itulah mengapa saya menanyakan pertanyaan ini.

Intsab Haider
sumber
jika Anda membutuhkan memori yang besar untuk aplikasi Anda seperti game 3dmodels dll
januprasad
47
50 kelas tidak terlalu banyak.
Chris Hayes
Jika Anda menggunakan beberapa layanan atau aplikasi aplikasi lain di dalam aplikasi Anda yang menghabiskan memori maka aplikasi Anda akan memiliki masalah memori seperti kamera adalah masalah yang paling umum dihadapi pengembang saat menggunakan aplikasi atau jika Anda memiliki banyak variabel yang memakan memori atau statis variabel mungkin juga menjadi alasannya.
Aditi
4
Jumlah kelas tidak penting. Yang biasanya membutuhkan banyak memori adalah bitmap. Lihat " Memuat Versi yang Diperkecil ke Memori ".
ToolmakerSteve

Jawaban:

116

Sudah terlambat untuk pesta di sini, tapi saya akan menawarkan $ 0,02.
Bukan ide yang baik untuk menggunakan android:largeHeap="true" ekstrak dari google yang menjelaskannya,

Namun, kemampuan untuk meminta tumpukan besar hanya ditujukan untuk sekumpulan kecil aplikasi yang dapat membenarkan kebutuhan untuk mengonsumsi lebih banyak RAM (seperti aplikasi pengeditan foto besar). Jangan pernah meminta tumpukan besar hanya karena Anda kehabisan memori dan Anda perlu perbaikan cepat — Anda harus menggunakannya hanya jika Anda tahu persis di mana semua memori Anda dialokasikan dan mengapa harus disimpan. Namun, meskipun Anda yakin aplikasi Anda dapat memenuhi syarat heap yang besar, Anda harus menghindari memintanya sejauh mungkin. Menggunakan memori ekstra akan semakin merusak pengalaman pengguna secara keseluruhan karena pengumpulan sampah akan memakan waktu lebih lama dan kinerja sistem mungkin lebih lambat saat pengalihan tugas atau melakukan operasi umum lainnya.

Berikut tautan lengkap dokumentasi https://developer.android.com/training/articles/memory.html

MEMPERBARUI

Setelah bekerja dengan sangat baik, out of memory errorssaya akan mengatakan menambahkan ini ke manifes untuk menghindari masalah oom bukanlah dosa, juga seperti yang ditunjukkan @Milad di bawah ini tidak memengaruhi kerja normal aplikasi

UPDATE 2

Berikut adalah beberapa tips untuk mengatasi denganout of memory errors

1) Gunakan callback yang diberikan android onLowMemory, onTrimMemory(int) dan hapus cache gambar seperti (picasso, glide, fresco ....) Anda dapat membaca lebih lanjut tentang mereka di sini dan di sini
2) kompres file Anda (gambar, pdf)
3) baca tentang cara menangani bitmap dengan lebih efisien di sini
4) Gunakan lint secara teratur sebelum produksi didorong untuk memastikan kodenya ramping dan tidak besar

Mightian
sumber
1
Mengapa Anda mengatakan "ini tidak memengaruhi kerja normal aplikasi"? Jawaban ini membahas beberapa konsekuensi. Di tempat lain, saya telah melihat waktu yang lebih buruk diukur untuk largeHeap GC di beberapa aplikasi.
ToolmakerSteve
59

Saya rasa ini adalah pertanyaan yang sangat efektif, dan izinkan saya menambahkan beberapa detail tentang keuntungan dan kerugian menggunakan opsi ini.

Apa yang kau dapatkan :

  • Jelas, Anda mendapatkan heap yang lebih besar, yang berarti mengurangi risiko OutOfMemoryError.

Apa yang Anda Kalah:

  • Anda mungkin kehilangan beberapa frame, yang dapat menyebabkan hitching yang terlihat . Heap yang lebih besar membuat pengumpulan sampah membutuhkan waktu lebih lama. Karena pengumpul sampah pada dasarnya harus melintasi seluruh kumpulan objek langsung Anda. Biasanya, waktu jeda pengumpulan sampah sekitar 5 md, dan Anda mungkin berpikir beberapa milidetik bukanlah masalah besar. Tapi setiap hitungan milidetik. Perangkat Android harus memperbarui layarnya setiap 16 md dan waktu GC yang lebih lama dapat mendorong waktu pemrosesan bingkai Anda melewati batas 16 milidetik, yang dapat menyebabkan hitching yang terlihat.

  • Perpindahan aplikasi juga akan menjadi lebih lambat . Sistem Android dapat menghentikan proses dalam cache LRU yang dimulai dengan proses yang paling jarang digunakan, tetapi juga mempertimbangkan proses mana yang paling banyak menggunakan memori. Jadi, jika Anda menggunakan heap yang lebih besar, proses Anda kemungkinan besar akan terhenti saat berada di latar belakang, yang berarti mungkin perlu waktu lebih lama saat pengguna ingin beralih dari aplikasi lain ke aplikasi Anda. Selain itu, proses latar belakang lainnya kemungkinan besar akan dikeluarkan saat proses Anda berjalan di latar depan, karena aplikasi Anda memerlukan memori yang lebih besar. Artinya, beralih dari aplikasi Anda ke aplikasi lain juga membutuhkan waktu lebih lama.

Kesimpulan:

Hindari menggunakan largeHeapopsi sebanyak mungkin. Ini dapat membuat Anda kehilangan kinerja yang sulit dilihat dan pengalaman pengguna yang buruk.

김준호
sumber
17

Saya memiliki Aplikasi dengan hampir 50 kelas

Saya tidak berpikir ini membuat banyak masalah. Alasan mengapa Anda mendapatkan kesalahan outOfMemory biasanya memuat terlalu banyak gambar di aplikasi Anda atau sesuatu seperti itu. Jika Anda tidak senang menggunakan heap besar, Anda harus menemukan cara untuk mengoptimalkan penggunaan memori.

Anda juga dapat menggunakan Perpustakaan Pemuatan Gambar seperti Picasso , UIL atau Glide . Semuanya memiliki fitur image caching di memori dan / atau di disk.

Milad Faridnia
sumber
1
untuk pemuatan gambar saya biasanya merekomendasikan picaso atau universal image loader
Mightian
5
Meluncur lebih baik dan sedikit lebih dioptimalkan daripada Picasso
Damien Praca
1
@DamienPraca Saya rasa tidak, setidaknya jika Anda menggunakan tag dengan benar (setTag (), pauseTag (), resumeTag ()) di Picasso.
Ruslan Berozov
15

Sebenarnya android: largeHeap adalah instrumen untuk meningkatkan memori yang dialokasikan ke aplikasi.

Tidak ada definisi yang jelas tentang perlunya menggunakan flag ini. Jika Anda membutuhkan lebih banyak memori - Android memberi Anda alat untuk meningkatkannya. Tapi kebutuhan menggunakan, Anda mendefinisikan diri Anda sendiri.

Sergey Shustikov
sumber
4
ya ada definisi yang jelas lihat tautan ini developer.android.com/training/articles/memory.html
Mightian
2
@war_Hero - mungkinkah artikel itu telah mengubah isinya? Tidak ada penyebutan besarHeap di dalamnya.
ToolmakerSteve
7

Jika Anda harus menggunakan (dan mempertahankan) memori dalam jumlah besar, maka ya, Anda dapat dan harus menggunakan android:largeHeap="true". Namun jika Anda menggunakannya, Anda harus siap untuk menghapus aplikasi Anda dari memori setiap kali aplikasi lain berada di latar depan.

Yang saya maksud dengan "bersiaplah" adalah Anda harus merancang kemungkinan itu, sehingga metode onStop()dan Anda onResume()ditulis seefisien mungkin, sambil memastikan bahwa semua status terkait disimpan dan dipulihkan dengan cara yang menghadirkan tampilan yang mulus bagi pengguna.

Ada tiga metode yang berhubungan dengan parameter ini: maxMemory(), getMemoryClass(), dan getLargeMemoryClass().

Untuk sebagian besar perangkat, maxMemory()akan mewakili nilai yang mirip getMemoryClass()dengan default, meskipun yang terakhir dinyatakan dalam megabyte, sedangkan yang pertama dinyatakan dalam byte.

Saat Anda menggunakan largeHeapparameter, maxMemory()akan ditingkatkan ke tingkat yang lebih tinggi khusus perangkat, sementara getMemoryClass()akan tetap sama.

getMemoryClass()tidak membatasi ukuran heap Anda, tetapi ini memberi tahu Anda jumlah heap yang harus Anda gunakan jika Anda ingin aplikasi berfungsi dengan nyaman dan kompatibel dalam batasan perangkat tertentu tempat Anda menjalankan.

maxMemory()Sebaliknya, tidak membatasi ukuran tumpukan Anda, dan sehingga Anda mendapatkan akses ke tumpukan tambahan melalui peningkatan nilai, dan largeHeapmelakukan peningkatan yang nilai. Namun, peningkatan jumlah heap masih terbatas, dan batasan itu akan spesifik perangkat, yang berarti jumlah heap yang tersedia untuk aplikasi Anda akan bervariasi, bergantung pada sumber daya perangkat tempat aplikasi Anda berjalan. Jadi, menggunakan largeHeapbukanlah ajakan bagi aplikasi Anda untuk mengabaikan semua kehati-hatian dan mencari jalan melalui prasmanan makan sepuasnya.

Aplikasi Anda dapat menemukan dengan tepat berapa banyak memori yang akan disediakan pada perangkat tertentu melalui penggunaan largeHeapparameter dengan memanggil metode getLargeMemoryClass(). Nilai yang dikembalikan dalam megabyte.

Posting sebelumnya ini menyertakan diskusi tentang largeHeapparameter, serta sejumlah contoh tentang jumlah heap yang tersedia dengan dan tanpa penggunaannya, di beberapa perangkat Android tertentu:

Mendeteksi ukuran heap aplikasi di Android

Saya belum menerapkan aplikasi saya sendiri dengan parameter ini disetel ke true. Namun, saya memiliki beberapa kode intensif memori di salah satu aplikasi saya untuk menyusun serangkaian parameter terkait pengoptimalan, yang hanya berjalan selama pengembangan. Saya menambahkan largeHeapparameter hanya selama pengembangan, untuk menghindari kesalahan memori saat menjalankan kode ini. Tapi saya menghapus parameter (dan kode) sebelum menerapkan aplikasi.

Carl
sumber
1
"tinggalkan semua kehati-hatian dan cari jalan melalui prasmanan makan sepuasnya " 😂
Joshua Pinter
4

Apakah proses aplikasi Anda harus dibuat dengan heap Dalvik yang besar. Ini berlaku untuk semua proses yang dibuat untuk aplikasi. Ini hanya berlaku untuk aplikasi pertama yang dimuat ke dalam suatu proses; jika Anda menggunakan ID pengguna bersama untuk memungkinkan beberapa aplikasi menggunakan suatu proses, mereka semua harus menggunakan opsi ini secara konsisten atau mereka akan mendapatkan hasil yang tidak dapat diprediksi.

Sebagian besar aplikasi seharusnya tidak memerlukan ini dan sebaliknya harus fokus pada pengurangan penggunaan memori secara keseluruhan untuk meningkatkan kinerja. Mengaktifkan ini juga tidak menjamin peningkatan tetap dalam memori yang tersedia, karena beberapa perangkat dibatasi oleh total memori yang tersedia.

Murali Ganesan
sumber