Saya telah melihat banyak jawaban Android yang menyarankan memanggil pengumpul sampah dalam beberapa situasi.
Apakah praktik yang baik untuk meminta pengumpul sampah di Android sebelum melakukan operasi yang membutuhkan banyak memori? Jika tidak, haruskah saya memanggilnya hanya jika saya mendapatkan OutOfMemory
kesalahan?
Apakah ada hal lain yang harus saya gunakan sebelum beralih ke pemulung?
sumber
Secara umum, di hadapan seorang kolektor sampah, itu adalah tidak pernah praktik yang baik untuk memanggil secara manual GC. GC diatur berdasarkan algoritme heuristik yang bekerja paling baik saat diserahkan ke perangkatnya sendiri. Memanggil GC secara manual sering kali menurunkan kinerja.
Kadang-kadang , dalam beberapa situasi yang relatif jarang, seseorang mungkin menemukan bahwa GC tertentu salah, dan panggilan manual ke GC kemudian dapat meningkatkan banyak hal, dari segi kinerja. Ini karena sangat tidak mungkin untuk menerapkan GC "sempurna" yang akan mengelola memori secara optimal di semua kasus. Situasi seperti itu sulit untuk diprediksi dan bergantung pada banyak detail implementasi yang tidak kentara. "Praktik yang baik" adalah membiarkan GC berjalan dengan sendirinya; panggilan manual ke GC adalah pengecualian, yang harus dibayangkan hanya setelah masalah kinerja yang sebenarnya telah disaksikan.
sumber
Bitmap.finalize()
metode yang membebaskan memori non-VM). Oleh karena itu dalam kasus ini, Anda harus membahas kepala GC dan menjalankanBitmap.recycle()
atauSystem.gc()
jika perlu. Tapi hanya sebelum sarang lebah.Kehabisan memori di aplikasi android sangat umum jika kita tidak menangani bitmap dengan benar, Solusi untuk masalah tersebut adalah
Dalam kode di atas Saya baru saja mencoba mendaur ulang bitmap yang akan memungkinkan Anda untuk mengosongkan ruang memori yang digunakan, jadi kehabisan memori mungkin tidak terjadi. Saya telah mencobanya berhasil untuk saya.
Jika masih menghadapi masalah Anda juga bisa menambahkan garis ini juga
untuk informasi lebih lanjut lihat tautan ini
https://web.archive.org/web/20140514092802/http://voices.yahoo.com/android-virtual-machine-vm-out-memory-error-7342266.html?cat=59
CATATAN: Karena "jeda" sesaat yang disebabkan oleh gc, tidak disarankan untuk melakukan ini sebelum setiap alokasi bitmap.
Desain yang optimal adalah:
Bebaskan semua bitmap yang tidak lagi diperlukan , dengan
if / recycle / null
kode yang ditampilkan. (Buat metode untuk membantu itu.)System.gc();
Alokasikan bitmap baru.
sumber
Jika Anda mendapatkan OutOfMemoryError maka biasanya sudah terlambat untuk memanggil pengumpul sampah ...
Berikut kutipan dari Pengembang Android:
Jadi menurut pemahaman saya, tidak ada kebutuhan mendesak untuk menelepon gc. Lebih baik menghabiskan lebih banyak usaha untuk menghindari pembuatan objek yang tidak perlu (seperti pembuatan objek di dalam loop)
sumber
Sepertinya
System.gc()
tidak berfungsi pada Art Android 6.0.1 Nexus 5x, Jadi saya gunakanRuntime.getRuntime().gc();
sebagai gantinya.sumber
System.gc()
adalah fungsi pembungkus untukRuntime.getRuntime().gc()
. Lihat android.googlesource.com/platform/libcore/+/…System.gc()
tidak berhasil untuk saya tapiRuntime.getRuntime().gc()
bisa!Aplikasi saya mengelola banyak gambar dan mati dengan OutOfMemoryError. Ini membantu saya. Dalam Manifest.xml Add
sumber
Secara umum, Anda tidak boleh memanggil GC secara eksplisit dengan System.gc (). Bahkan ada kuliah IO ( http://www.youtube.com/watch?v=_CruQY55HOk ) di mana mereka menjelaskan apa arti log jeda GC dan di mana mereka juga menyatakan untuk tidak pernah memanggil System.gc () karena Dalvik lebih tahu dari pada Anda saat melakukannya.
Di sisi lain seperti yang disebutkan dalam jawaban di atas, proses GC di Android (seperti yang lainnya) terkadang buggy. Ini berarti algoritme Dalvik GC tidak setara dengan Hotspot atau JVM JRockit dan mungkin mengalami kesalahan pada beberapa kesempatan. Salah satunya adalah saat mengalokasikan objek bitmap. Ini rumit karena menggunakan memori Heap dan Non Heap dan karena satu contoh objek bitmap yang longgar pada perangkat yang dibatasi memori sudah cukup untuk memberi Anda pengecualian OutOfMemory. Jadi memanggilnya setelah Anda tidak memerlukan bitmap ini lagi biasanya disarankan oleh banyak pengembang dan bahkan dianggap praktik yang baik oleh sebagian orang.
Praktik yang lebih baik adalah menggunakan .recycle () pada bitmap karena untuk itulah metode ini dibuat, karena menandai memori asli bitmap sebagai aman untuk dihapus. Perlu diingat bahwa ini sangat bergantung pada versi, yang berarti ini umumnya akan diperlukan pada versi Android yang lebih lama (menurut saya Pre 3.0) tetapi tidak akan diperlukan pada versi yang lebih baru. Juga tidak ada salahnya menggunakannya pada versi eter yang lebih baru (jangan lakukan ini dalam satu lingkaran atau sesuatu seperti itu). Runtime ART baru banyak berubah di sini karena mereka memperkenalkan "partisi" Heap khusus untuk objek besar, tetapi menurut saya tidak ada salahnya melakukan hal ini dengan ART eter.
Juga satu catatan yang sangat penting tentang System.gc (). Metode ini bukan perintah yang harus ditanggapi oleh Dalvik (atau JVM). Anggap saja lebih seperti mengatakan ke mesin Virtual "Bisakah Anda melakukan pengumpulan sampah jika tidak merepotkan".
sumber
Cara terbaik untuk menghindari OOM selama pembuatan Bitmap,
http://developer.android.com/training/displaying-bitmaps/index.html
sumber
Saya akan mengatakan tidak, karena dokumen Pengembang tentang status penggunaan RAM :
Saya telah menandai bagian yang relevan dengan huruf tebal.
Lihatlah seri YouTube, Pola Kinerja Android - ini akan menunjukkan kepada Anda tip-tip dalam mengelola penggunaan memori aplikasi Anda (seperti menggunakan Android
ArrayMap
danSparseArray
bukannyaHashMap
s).sumber
Catatan singkat untuk pengembang Xamarin .
Jika Anda ingin menelepon
System.gc()
di aplikasi Xamarin.Android Anda harus meneleponJava.Lang.JavaSystem.Gc()
sumber
Tidak perlu memanggil pengumpul sampah setelah
OutOfMemoryError
.Javadoc dengan jelas menyatakan:
Jadi, pengumpul sampah sudah mencoba mengosongkan memori sebelum menghasilkan kesalahan tetapi tidak berhasil.
sumber