Merekam heap dump

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 memiliki FragmentManager 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 dari FragmentTransaction.

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 penampung Activity atau Context.
  • Class dalam non-statis, seperti Runnable, yang dapat menyimpan instance Activity.
  • 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, atau View karena sistem membuat ulang Activity, 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