Merekam alokasi Java/Kotlin membantu Anda mengidentifikasi pola memori yang tidak diinginkan yang mungkin menyebabkan masalah performa. Profiler dapat menunjukkan hal-hal berikut tentang alokasi objek:
- Jenis objek yang telah dialokasikan dan banyaknya ruang yang digunakannya.
- Stack trace dari setiap alokasi, termasuk di thread mana.
- Saat objek dibatalkan alokasinya.
Anda harus merekam alokasi memori selama interaksi pengguna yang normal dan ekstrem untuk mengidentifikasi secara persis ke mana kode Anda mengalokasikan terlalu banyak objek dalam waktu singkat atau mengalokasikan objek yang kemudian bocor. Pelajari lebih lanjut alasan Anda harus membuat profil memori aplikasi.
Cara merekam alokasi Java/Kotlin
Untuk merekam alokasi Java/Kotlin, pilih tugas Track Memory Consumption (Java/Kotlin Allocations) dari tab Home profiler. Perhatikan bahwa Anda memerlukan aplikasi yang dapat di-debug (gunakan Profiler: jalankan 'app' sebagai dapat di-debug (data lengkap)) untuk merekam alokasi Java/Kotlin.
Android Studio merekam semua alokasi objek dalam memori secara default. Jika memiliki aplikasi yang mengalokasikan banyak objek, Anda mungkin melihat pelambatan yang cukup jelas dengan aplikasi saat membuat profil. Untuk meningkatkan performa saat membuat profil, buka drop-down Pelacakan Alokasi dan pilih Disampel, bukan Penuh. Saat mengambil sampel, profiler mengumpulkan alokasi objek dalam memori pada interval reguler.
Untuk memaksa peristiwa pembersihan sampah memori saat merekam, klik ikon sampah
.
Ringkasan alokasi Java/Kotlin
Setelah Anda menghentikan perekaman, Anda akan melihat hal berikut:
- Linimasa peristiwa menampilkan status aktivitas, peristiwa input pengguna, dan peristiwa rotasi layar.
- Linimasa penggunaan memori menampilkan info berikut. Pilih sebagian linimasa untuk memfilter ke rentang waktu tertentu.
- Grafik bertumpuk tentang banyaknya memori yang sedang digunakan oleh setiap kategori memori, sebagaimana ditunjukkan oleh sumbu y di sebelah kiri dan kunci warna di bagian atas.
- Garis putus-putus yang menunjukkan jumlah objek yang dialokasikan, sebagaimana ditunjukkan oleh sumbu y di sebelah kanan.
- Ikon untuk setiap peristiwa pembersihan sampah memori.
- Tab Tabel menampilkan daftar kelas. Total Count adalah jumlah alokasi di akhir rentang waktu yang dipilih (Alokasi dikurangi Dealokasi), jadi sebaiknya debug kelas yang memiliki nilai Total Count tertinggi terlebih dahulu. Jika Anda lebih tertarik untuk memecahkan masalah kelas berdasarkan alokasi puncak selama rentang waktu yang dipilih, prioritaskan menurut Alokasi. Demikian pula, Ukuran Tersisa adalah Ukuran Alokasi dikurangi Ukuran Dealokasi dalam byte.
- Saat Anda mengklik class dalam daftar Table, panel Instance akan terbuka dengan daftar objek terkait, termasuk saat objek dialokasikan, saat objek dibatalkan alokasinya, dan ukuran dangkal objek.
Tab Visualisasi menampilkan tampilan gabungan dari semua objek dalam stack panggilan selama rentang waktu yang dipilih. Pada dasarnya, ini menunjukkan jumlah total memori yang digunakan oleh stack panggilan dengan instance yang ditampilkan. Baris pertama menampilkan nama thread. Secara default, objek ditumpuk dari kiri ke kanan berdasarkan ukuran alokasi; gunakan drop-down untuk mengubah pengurutan.
Gunakan drop-down heap untuk memfilter heap tertentu. Selain filter yang tersedia saat Anda merekam dump heap, Anda dapat memfilter ke class di heap JNI, heap yang menunjukkan tempat referensi Java Native Interface (JNI) dialokasikan dan dilepaskan.
Gunakan drop-down pengaturan untuk memilih cara mengatur alokasi. Selain pengaturan yang tersedia saat Anda merekam dump heap, Anda dapat mengatur menurut callstack.
Cara menghitung memori
Angka yang Anda lihat di bagian atas didasarkan pada semua halaman memori pribadi yang telah dilakukan oleh aplikasi Anda menurut sistem Android. Jumlah ini tidak mencakup halaman yang dibagikan ke sistem atau aplikasi lain. Kategori dalam jumlah memori adalah sebagai berikut:
- Java: Memori dari objek yang dialokasikan dari kode Java atau Kotlin.
Native: Memori dari objek yang dialokasikan dari kode C atau C++.
Meskipun tidak menggunakan C++ dalam aplikasi, Anda mungkin melihat ada beberapa memori native yang digunakan di sini karena framework Android menggunakannya untuk menangani berbagai tugas atas nama Anda, misalnya saat menangani aset gambar dan grafis lainnya, meskipun kode yang ditulis menggunakan bahasa Java atau Kotlin.
Grafis: Memori yang digunakan untuk antrean buffer grafis agar dapat menampilkan piksel ke layar, termasuk permukaan GL, tekstur GL, dan lainnya. Perhatikan bahwa ini adalah memori yang digunakan bersama CPU, bukan memori GPU khusus.
Stack: Memori yang digunakan oleh stack Java dan native dalam aplikasi Anda. Biasanya memori ini berkaitan dengan jumlah thread yang dijalankan oleh aplikasi Anda.
Code: Memori yang digunakan oleh aplikasi untuk kode dan resource, misalnya bytecode DEX, kode DEX yang telah dikompilasi atau dioptimalkan, .Library
so
, dan font.Lainnya: Memori yang digunakan oleh aplikasi Anda, tetapi sistem tidak yakin bagaimana cara mengategorikannya.
Dialokasikan: Jumlah objek Java/Kotlin yang dialokasikan oleh aplikasi Anda. Jumlah ini tidak termasuk objek yang dialokasikan di C atau C++.
Periksa catatan alokasi
Untuk memeriksa rekaman alokasi, ikuti langkah-langkah berikut:
- Jelajahi daftar class di tab Tabel untuk menemukan objek yang memiliki nilai Alokasi atau Jumlah Total yang tidak wajar (bergantung pada apa yang Anda optimalkan) dan yang mungkin bocor.
- Di panel Instance View, klik salah satu instance. Bergantung pada apa yang berlaku untuk instance tersebut, tab Kolom atau Stack Panggilan Alokasi akan terbuka. Gunakan informasi di tab Kolom atau Stack Panggilan Alokasi untuk menentukan apakah instance benar-benar diperlukan atau duplikasi yang tidak perlu.
Klik kanan entri daftar mana pun untuk membuka kode sumber yang relevan.
Menampilkan referensi JNI global
Java Native Interface (JNI) adalah framework yang memungkinkan kode Java dan kode native saling memanggil. Referensi JNI dikelola secara manual oleh kode native, sehingga masalah berikut dapat terjadi:
- Objek Java yang digunakan oleh kode native tetap aktif terlalu lama.
- Beberapa objek di heap Java mungkin menjadi tidak terjangkau jika referensi JNI dibuang tanpa dihapus secara eksplisit terlebih dahulu.
- Batas referensi JNI global telah habis.
Untuk memecahkan masalah tersebut, pilih Lihat heap JNI di profiler untuk menjelajahi semua referensi JNI global dan memfilternya menurut tipe Java dan stack panggilan native. Klik kanan kolom instance di tab Fields, lalu pilih Go to instance untuk melihat call stack alokasi yang relevan.
Tab Allocation Call Stack menunjukkan tempat referensi JNI dialokasikan dan dilepaskan dalam kode Anda.
Untuk mengetahui informasi selengkapnya tentang JNI, lihat tips JNI.