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.
android
android-largeheap
Intsab Haider
sumber
sumber
Jawaban:
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,Berikut tautan lengkap dokumentasi https://developer.android.com/training/articles/memory.html
Setelah bekerja dengan sangat baik,
out of memory errors
saya akan mengatakan menambahkan ini ke manifes untuk menghindari masalah oom bukanlah dosa, juga seperti yang ditunjukkan @Milad di bawah ini tidak memengaruhi kerja normal aplikasiBerikut adalah beberapa tips untuk mengatasi dengan
out 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 sini2) 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
sumber
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 :
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
largeHeap
opsi sebanyak mungkin. Ini dapat membuat Anda kehilangan kinerja yang sulit dilihat dan pengalaman pengguna yang buruk.sumber
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.
sumber
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.
sumber
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 AndaonResume()
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()
, dangetLargeMemoryClass()
.Untuk sebagian besar perangkat,
maxMemory()
akan mewakili nilai yang miripgetMemoryClass()
dengan default, meskipun yang terakhir dinyatakan dalam megabyte, sedangkan yang pertama dinyatakan dalam byte.Saat Anda menggunakan
largeHeap
parameter,maxMemory()
akan ditingkatkan ke tingkat yang lebih tinggi khusus perangkat, sementaragetMemoryClass()
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, danlargeHeap
melakukan 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, menggunakanlargeHeap
bukanlah 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
largeHeap
parameter dengan memanggil metodegetLargeMemoryClass()
. Nilai yang dikembalikan dalam megabyte.Posting sebelumnya ini menyertakan diskusi tentang
largeHeap
parameter, 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
largeHeap
parameter hanya selama pengembangan, untuk menghindari kesalahan memori saat menjalankan kode ini. Tapi saya menghapus parameter (dan kode) sebelum menerapkan aplikasi.sumber
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.
sumber