Ambil heap dump untuk melihat objek mana dalam aplikasi Anda yang menggunakan memori pada saat pengambilan dan identifikasi kebocoran memori, atau perilaku alokasi memori yang menyebabkan aplikasi tersendat, berhenti merespons, dan bahkan tidak bekerja. Sangatlah membantu untuk melakukan heap dump setelah sesi pengguna yang cukup lama, saat heap dump dapat menampilkan objek yang masih dalam memori yang seharusnya sudah tidak ada lagi di sana.
Halaman ini menjelaskan alat yang disediakan Android Studio untuk mengumpulkan dan
menganalisis dump heap. Atau, Anda dapat memeriksa memori aplikasi dari
command line dengan dumpsys
dan juga melihat
peristiwa pembersihan sampah memori (GC) di Logcat.
Alasan Anda harus membuat profil memori aplikasi
Android menyediakan lingkungan memori terkelola—saat Android menentukan bahwa aplikasi Anda tidak lagi menggunakan beberapa objek, pembersih sampah memori akan melepas memori yang tidak terpakai kembali ke heap. Cara Android melakukan pencarian memori yang tidak terpakai akan terus ditingkatkan, tetapi pada beberapa titik dalam semua versi Android, sistem harus menjeda kode Anda sesaat. Umumnya, jeda itu tidak akan terasa. Namun, jika aplikasi mengalokasikan memori lebih cepat dari waktu sistem mengumpulkannya, aplikasi mungkin akan tertunda saat pembersih membebaskan memori dalam jumlah yang cukup untuk memenuhi alokasi Anda. Penundaan ini dapat menyebabkan aplikasi melewati beberapa frame dan menyebabkan kelambatan yang cukup terlihat.
Meskipun tidak menunjukkan kelambatan, jika membocorkan memori, aplikasi dapat menahan memori tersebut bahkan saat berada di latar belakang. Perilaku ini dapat memperlambat performa memori sistem yang tersisa dengan memaksakan peristiwa pembersihan sampah memori yang tidak perlu. Pada akhirnya, sistem akan dipaksa untuk mematikan proses aplikasi Anda guna mengambil kembali memori tersebut. Kemudian, saat pengguna kembali ke aplikasi Anda, proses aplikasi harus dimulai ulang secara menyeluruh.
Untuk mengetahui informasi tentang praktik pemrograman yang dapat mengurangi penggunaan memori aplikasi, baca Mengelola memori aplikasi Anda.
Ringkasan heap dump
Untuk merekam heap dump, pilih tugas Analyze Memory Usage (Heap Dump) (gunakan Profiler: run 'app' as debuggable (complete data)) untuk merekam heap dump. Saat membuang heap, jumlah memori Java mungkin bertambah untuk sementara. Hal ini normal karena heap dump terjadi dalam proses yang sama dengan aplikasi Anda dan memerlukan beberapa memori untuk mengumpulkan data. Setelah mengambil heap dump, Anda akan melihat hal berikut:
Daftar class menampilkan info berikut:
- Allocations: Jumlah alokasi dalam heap.
Native Size: Jumlah total memori native yang digunakan oleh jenis objek ini (dalam byte). Anda akan melihat memori di sini untuk beberapa objek yang dialokasikan di Java karena Android menggunakan memori native untuk beberapa class framework, seperti
Bitmap
.Shallow Size: Jumlah total memori Java yang digunakan oleh jenis objek ini (dalam byte).
Retained Size: Ukuran total memori yang dipertahankan karena semua instance class ini (dalam byte).
Gunakan menu heap untuk memfilter ke heap tertentu:
- App heap (default): Heap utama tempat aplikasi Anda mengalokasikan memori.
- Image heap: Image boot sistem, berisi class yang dipramuat selama waktu booting. Alokasi di sini tidak pernah berpindah atau hilang.
- Zygote heap: Heap salin-saat-menulis, yang menjadi tempat pemisahan proses aplikasi di sistem Android.
Gunakan drop-down pengaturan untuk memilih cara mengatur alokasi:
- Arrange by class (default): Mengelompokkan semua alokasi berdasarkan nama class.
- Arrange by package: Mengelompokkan semua alokasi berdasarkan nama paket.
Gunakan drop-down kelas untuk memfilter ke grup kelas:
- Semua class (default): Menampilkan semua class, termasuk class dari library dan dependensi.
- Tampilkan kebocoran aktivitas/fragmen: Menampilkan class yang menyebabkan kebocoran memori.
- Tampilkan class project: hanya menampilkan class yang ditentukan oleh project Anda.
Klik nama class untuk membuka panel Instance. Setiap instance yang tercantum menyertakan hal berikut:
- Depth: Jumlah lompatan tersingkat dari GC root ke instance yang dipilih.
- Native Size: Ukuran instance ini dalam memori native. Kolom ini hanya terlihat untuk Android 7.0 dan yang lebih tinggi.
- Shallow Size: Ukuran instance ini dalam memori Java.
- Retained Size: Ukuran memori yang didominasi instance ini (berdasarkan hierarki dominator).
Klik instance untuk menampilkan Detail Instance, termasuk Kolom dan Referensi-nya. Jenis kolom dan referensi umum adalah jenis terstruktur , array , dan jenis data primitif di Java. Klik kanan kolom atau referensi untuk membuka instance atau baris terkait dalam kode sumber.
- Kolom: Menampilkan semua kolom dalam instance ini.
- Referensi: Menampilkan setiap referensi ke objek yang ditandai di tab Instance.
Menemukan kebocoran memori
Untuk memfilter dengan cepat ke class yang mungkin terkait dengan kebocoran memori, buka dropdown class dan pilih Show activity/fragment leaks. Android Studio
menampilkan class yang dianggapnya menunjukkan kebocoran memori untuk
instance Activity
dan
Fragment
di aplikasi Anda. Jenis
data yang ditampilkan filter mencakup hal berikut:
- Instance
Activity
yang telah dihapus tetapi masih direferensikan. - Instance
Fragment
yang tidak memilikiFragmentManager
yang valid, tetapi masih direferensikan.
Perhatikan bahwa filter mungkin menghasilkan positif palsu dalam situasi berikut:
Fragment
dibuat tetapi belum digunakan.Fragment
di-cache, tetapi bukan sebagai bagian dariFragmentTransaction
.
Untuk mencari kebocoran memori secara lebih manual, jelajahi daftar class dan instance untuk menemukan objek dengan Retained Size yang besar. Cari kebocoran memori yang disebabkan oleh salah satu hal berikut:
- Referensi berumur panjang ke
Activity
,Context
,View
,Drawable
, dan objek lainnya yang mungkin menyimpan referensi ke penampungActivity
atauContext
. - Class dalam non-statis, seperti
Runnable
, yang dapat menyimpan instanceActivity
. - Cache yang menyimpan objek lebih lama dari yang diperlukan.
Saat Anda menemukan potensi kebocoran memori, gunakan tab Kolom dan Referensi di Detail Instance untuk beralih ke baris instance atau kode sumber yang diinginkan.
Memicu kebocoran memori untuk pengujian
Untuk menganalisis penggunaan memori, Anda harus memberikan tekanan pada kode aplikasi Anda dan mencoba memaksa kebocoran memori. Salah satu cara untuk menyebabkan kebocoran memori dalam aplikasi adalah dengan membiarkannya berjalan beberapa lama sebelum memeriksa heap. Kebocoran mungkin sampai ke bagian atas alokasi dalam heap tersebut. Namun, semakin kecil kebocorannya, semakin lama Anda perlu menjalankan aplikasi untuk melihatnya.
Anda juga dapat memicu kebocoran memori dengan salah satu cara berikut:
- Putar perangkat beberapa kali dari potret ke lanskap dan kembali lagi
saat dalam berbagai status aktivitas. Memutar perangkat sering kali dapat menyebabkan aplikasi membocorkan objek
Activity
,Context
, atauView
karena sistem membuat ulangActivity
, dan jika aplikasi Anda menyimpan referensi ke salah satu objek tersebut di tempat lain, sistem tidak dapat membersihkan sampah memorinya. - Beralihlah antar aplikasi Anda dan aplikasi lain dalam berbagai status aktivitas. Misalnya, buka layar utama, lalu kembali ke aplikasi Anda.
Mengekspor dan mengimpor rekaman heap dump
Anda dapat
mengekspor dan mengimpor file heap dump
dari tab Rekaman Sebelumnya di profiler. Android Studio menyimpan
perekaman sebagai file .hprof
.
Atau, untuk menggunakan penganalisis file .hprof
lain seperti
jhat,
Anda perlu mengonversi file .hprof
dari format Android menjadi format file
.hprof
Java SE. Untuk mengonversi format file, gunakan alat hprof-conv
yang disediakan di direktori {android_sdk}/platform-tools/
. Jalankan perintah hprof-conv
dengan dua argumen: nama file .hprof
asli dan lokasi untuk
menulis file .hprof
yang telah dikonversi, termasuk nama file .hprof
baru. Contoh:
hprof-conv heap-original.hprof heap-converted.hprof