Saya memiliki aplikasi Android yang dikembangkan, dan saya berada pada titik pengembangan aplikasi telepon di mana semuanya tampak bekerja dengan baik dan Anda ingin mendeklarasikan kemenangan dan pengiriman, tetapi Anda tahu harus ada kebocoran memori dan sumber daya. di sana; dan hanya ada 16MB tumpukan di Android dan ternyata mudah bocor di aplikasi Android.
Saya sudah mencari-cari dan sejauh ini hanya mampu menggali info tentang 'hprof' dan 'traceview' dan tidak ada yang mendapat banyak ulasan yang menguntungkan.
Apa alat atau metode yang Anda temui atau kembangkan dan Anda ingin berbagi mungkin dalam proyek OS?
android
memory-leaks
jottos
sumber
sumber
Jawaban:
Salah satu kesalahan paling umum yang saya temukan dalam mengembangkan Aplikasi Android adalah kesalahan "java.lang.OutOfMemoryError: Bitmap Size Exceed VM Budget". Saya menemukan kesalahan ini pada kegiatan yang menggunakan banyak bitmap setelah mengubah orientasi: Kegiatan dihancurkan, dibuat lagi dan tata letak "meningkat" dari XML yang memakan memori VM yang tersedia untuk bitmap.
Bitmap pada tata letak aktivitas sebelumnya tidak dialokasikan dengan benar oleh pengumpul sampah karena mereka telah melewati referensi ke aktivitas mereka. Setelah banyak percobaan saya menemukan solusi yang cukup bagus untuk masalah ini.
Pertama, atur atribut "id" pada tampilan induk dari tata letak XML Anda:
Kemudian, pada metode onDestroy () dari Aktivitas Anda, panggil metode unbindDrawables () yang meneruskan refence ke tampilan induk dan kemudian lakukan System.gc ()
Metode unbindDrawables () ini mengeksplorasi pohon tampilan secara rekursif dan:
sumber
PageAdapter
dan saya sedang dikerjakan oleh kesalahan ini :(Dapatkan Eclipse Memory Analyzer ( http://www.eclipse.org/mat/ ) Periksa http://kohlerm.blogspot.com/2010/02/android-memory-usage-analysis-slides.html dan http: // kohlerm.blogspot.com/search/label/memory
sumber
Sebagian besar untuk pelancong Google dari masa depan:
Kebanyakan alat java sayangnya tidak cocok untuk tugas ini, karena mereka hanya menganalisis JVM-Heap. Setiap Aplikasi Android juga memiliki heap asli, yang juga harus masuk dalam batas ~ 16 MB. Ini biasanya digunakan untuk data bitmap, misalnya. Jadi, Anda dapat dengan mudah menjalankan kesalahan Kehabisan Memori meskipun JVM-Heap Anda adalah chillin sekitar 3 MB, jika Anda menggunakan banyak drawable.
sumber
Jawaban dari @ hp.android berfungsi dengan baik jika Anda hanya bekerja dengan latar belakang bitmap tetapi, dalam kasus saya, saya telah
BaseAdapter
menyediakan satu setImageView
s untuk aGridView
. Saya memodifikasiunbindDrawables()
metode seperti yang disarankan sehingga kondisinya adalah:tetapi masalahnya kemudian adalah bahwa metode rekursif tidak pernah memproses anak - anak
AdapterView
. Untuk mengatasi ini, saya malah melakukan yang berikut:sehingga anak-anak
AdapterView
masih diproses - metode ini tidak berusaha untuk menghapus semua anak (yang tidak didukung).Ini tidak cukup memperbaiki masalah namun karena
ImageView
mengelola bitmap yang bukan latar belakang mereka. Karena itu saya menambahkan yang berikut ini. Ini tidak ideal tetapi berfungsi:Secara keseluruhan
unbindDrawables()
metode ini adalah:Saya berharap ada pendekatan yang lebih berprinsip untuk membebaskan sumber daya semacam itu.
sumber
Google I / O talk yang baik (2011) tentang Manajemen Memori di Android, serta rincian tentang alat + teknik untuk profil memori:
http://www.youtube.com/watch?v=_CruQY55HOk
sumber
Valgrind telah porting ke Android (disponsori oleh Mozilla). Lihat Valgrind di Android - Status Saat Ini dan Dukungan Menjalankan Valgrind untuk Android di ARM (komentar 67).
sumber
Ya, itu adalah alat yang menghubungkan dengan format unik yang digunakan Android .. Saya pikir apa yang mungkin Anda tidak puas adalah kerangka kode pengujian yang mendasarinya sedang digunakan ..
Sudahkah Anda mencoba menguji area kode dengan menggunakan Android Mock Framework?
sumber