Rekam heap dump untuk melihat objek mana dalam aplikasi Anda yang menggunakan banyak memori pada saat perekaman dan mengidentifikasi kebocoran memori, atau perilaku alokasi memori yang menyebabkan stutter, berhenti berfungsi, dan bahkan aplikasi error. Heap dump sangat membantu jika diambil setelah sesi pengguna yang cukup lama, karena 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 heap dump. 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 kembali memori yang tidak terpakai ke heap. Cara Android menemukan memori yang tidak digunakan terus ditingkatkan, tetapi pada suatu titik di semua versi Android, sistem harus menghentikan kode Anda untuk sementara. Sebagian besar waktu, jeda tidak terlihat. 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 sepenuhnya.
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 merekam heap dump, Anda akan melihat hal berikut:
Daftar class menampilkan info berikut:
- Alokasi: Jumlah alokasi dalam heap.
Ukuran Native: Jumlah total memori native yang digunakan oleh tipe 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.Ukuran Dangkal: Jumlah total memori Java yang digunakan oleh tipe objek ini (dalam byte).
Ukuran yang Dipertahankan: 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 pada waktu boot. 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 class untuk memfilter ke grup class:
- All classes (default): Menampilkan semua class, termasuk class dari library dan dependensi.
- Show activity/fragment leaks: Menampilkan class yang menyebabkan kebocoran memori.
- Show project classes: 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.
- Ukuran yang Dipertahankan: Ukuran memori yang didominasi instance ini (berdasarkan hierarki dominator)).
Klik instance untuk menampilkan Instance Details, termasuk Fields
dan References. 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.
- Fields: Menampilkan semua kolom dalam instance ini.
- Referensi: Menampilkan setiap referensi ke objek yang ditandai di tab Instance.
Mendeteksi bitmap duplikat
Anda juga dapat mendeteksi bitmap redundan di tampilan Heap Dump mulai dari Android Studio Narwhal 4.
Berikut cara menemukannya:
- Buka tab Profiler di Android Studio
- Klik Heap Dump (atau Analyze Memory Usage) dan klik rekam untuk mengambil snapshot status memori aplikasi saat ini.
- Pindai hasil analisis untuk mencari segitiga peringatan kuning ⚠️, yang digunakan Android Studio untuk menandai bitmap duplikat yang disimpan beberapa kali.
- Atau, buka header profiler, pilih Filter by: , lalu pilih setelan Duplicate Bitmaps.
- Klik entri yang ditandai untuk membuka panel Bitmap Preview , sehingga Anda dapat melihat dengan tepat gambar mana yang merupakan pelanggar berulang.
- Gunakan konfirmasi visual tersebut untuk melacak logika pemuatan redundan dalam kode Anda dan menerapkan strategi caching yang lebih baik.
Menemukan kebocoran memori
Untuk memfilter dengan cepat ke class yang mungkin terkait dengan kebocoran memori, buka drop-down class dan pilih Show activity/fragment leaks. Android Studio
menampilkan class yang dianggap menunjukkan kebocoran memori untuk
Activity dan
Fragment instance di aplikasi Anda.
Untuk mencari kebocoran memori secara lebih manual, telusuri 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
ActivityatauContextyang dapat membocorkan grafik komposisi Compose yang dihosting (sepertiComposeViewdan sub-komposisinya). - Membocorkan objek Status Jetpack Compose (
MutableState), penampung status, atau lambda yang mengambilContext. - Lupa membersihkan pemroses atau pengamat di blok
onDisposedariDisposableEffect. - Class internal non-statis, seperti a
Runnable, yang dapat menyimpanActivityinstance. - Cache yang menyimpan objek lebih lama dari yang diperlukan.
Saat menemukan potensi kebocoran memori, gunakan tab Fields dan References di Instance Details untuk membuka instance atau baris 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 tersebut untuk melihatnya.
Anda juga dapat memicu kebocoran memori dengan salah satu cara berikut:
- Putar perangkat beberapa kali dari potret ke lanskap dan kembali lagi dalam berbagai status aktivitas. Memutar perangkat sering kali dapat menyebabkan aplikasi
membocorkan
Activity(dan akibatnya hierarki UI Compose yang dihosting dan hierarki status terkait) jika aplikasi Anda menyimpan referensi keActivityatauContextdi dalam operasi asinkron atau penampung status. - Beralihlah antara 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 Past Recordings di profiler. Android Studio menyimpan rekaman sebagai file .hprof.
Atau, untuk menggunakan penganalisis file .hprof lainnya, 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