Mengukur penggunaan memori dalam Visual Studio (C#, Visual Basic, C++, F#)

Temukan kebocoran memori dan memori yang tidak efisien saat Anda menelusuri kesalahan dengan alat diagnostik Penggunaan Memori yang terintegrasi dengan penelusur kesalahan. Alat Penggunaan Memori memungkinkan Anda mengambil satu atau beberapa snapshot dari tumpukan memori terkelola dan asli untuk membantu memahami dampak penggunaan memori dari jenis objek. Anda juga dapat menganalisis penggunaan memori tanpa penelusur kesalahan yang terpasang atau dengan menargetkan aplikasi yang sedang berjalan. Untuk informasi selengkapnya, lihat Menjalankan alat pemrofilan dengan atau tanpa penelusur kesalahan. Untuk informasi tentang memilih alat analisis memori terbaik untuk kebutuhan Anda, lihat Memilih alat analisis memori.

Meskipun Anda dapat mengumpulkan snapshot memori kapan saja di alat Penggunaan Memori, Anda dapat menggunakan penelusur kesalahan Visual Studio untuk mengontrol cara aplikasi Anda dijalankan saat menyelidiki masalah performa. Mengatur titik henti, stepping, Break All, dan tindakan penelusur kesalahan lainnya dapat membantu Anda memfokuskan penyelidikan performa Anda pada jalur kode yang paling relevan. Melakukan tindakan tersebut saat aplikasi Anda berjalan dapat menghilangkan kebisingan dari kode yang tidak menarik minat Anda dan dapat secara signifikan mengurangi jumlah waktu yang diperlukan untuk mendiagnosis masalah.

Penting

Alat Diagnostik terintegrasi penelusur kesalahan didukung untuk pengembangan .NET dalam Visual Studio, termasuk aplikasi ASP.NET, ASP.NET Core, pengembangan asli/C++, dan mode campuran (.NET dan asli). Windows 8 dan yang lebih baru diperlukan untuk menjalankan alat pemrofilan dengan penelusur kesalahan (jendela Alat Diagnostik).

Dalam tutorial ini, Anda akan:

  • Mengambil snapshot memori
  • Menganalisis penggunaan memori

Jika Penggunaan Memori tidak memberi Anda data yang Anda butuhkan, alat pemrofilan lainnya di Profiler Performa memberikan berbagai jenis informasi yang mungkin berguna bagi Anda. Dalam banyak kasus, penyempitan performa aplikasi Anda mungkin disebabkan oleh sesuatu selain memori Anda, seperti CPU, perenderan antarmuka pengguna, atau waktu permintaan jaringan.

Catatan

Dukungan Alokator Kustom Profiler memori asli bekerja dengan mengumpulkan data peristiwa ETW alokasi yang dipancarkan selama durasi. Alokator di CRT dan Windows SDK telah dianotasikan pada tingkat sumber sehingga data alokasinya dapat ditangkap. Jika Anda menulis alokator Anda sendiri, maka fungsi apa pun yang mengembalikan penunjuk ke memori heap yang baru dialokasikan dapat dihiasi dengan __declspec(alokator), seperti yang terlihat dalam contoh ini untuk myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

Mengumpulkan data penggunaan memori

  1. Buka proyek yang ingin Anda debug di Visual Studio dan atur titik henti di aplikasi Anda pada titik di mana Anda ingin mulai memeriksa penggunaan memori.

    Jika Anda memiliki area tempat Anda mencurigai masalah memori, atur titik henti pertama sebelum masalah memori terjadi.

    Tip

    Karena bisa jadi sulit untuk menangkap profil memori operasi yang menarik minat Anda ketika aplikasi Anda sering mengalokasikan dan men-de-alokasikan memori, mengatur titik henti di awal dan akhir operasi (atau melangkah melalui operasi) untuk menemukan titik yang tepat yang diubah memori.

  2. Atur titik henti kedua di akhir fungsi atau wilayah kode yang ingin Anda analisis (atau setelah masalah memori yang dicurigai terjadi).

  3. Jendela Alat Diagnostik muncul secara otomatis kecuali Anda telah menonaktifkannya. Untuk memunculkan jendela lagi, klik Debug>Windows>Tampilkan Alat Diagnostik.

  4. Pilih Penggunaan Memori dengan pengaturan Pilih Alat pada toolbar.

    Screenshot of Diagnostics Tools.

    Screenshot of Diagnostics Tools.

  5. Klik Debug / Mulai Penelusuran Kesalahan (atau Mulai pada toolbar, atau F5).

    Saat aplikasi selesai memuat, tampilan Ringkasan Alat Diagnostik muncul.

    Screenshot of Diagnostics Tools Summary Tab.

    Catatan

    Karena mengumpulkan data memori dapat memengaruhi performa penelusuran kesalahan aplikasi asli atau mode campuran Anda, snapshot memori dinonaktifkan secara default. Untuk mengaktifkan snapshot di aplikasi asli atau mode campuran, mulai sesi penelusuran kesalahan (Kunci pintasan: F5). Saat jendela Alat Diagnostik muncul, pilih tab Penggunaan Memori, lalu pilih Pemrofilan Timbunan.

    Screenshot of Enable snapshots.

    Hentikan (Tombol pintasan: Shift+F5) dan mulai ulang penelusuran kesalahan.

    Screenshot of Diagnostics Tools Summary Tab.

    Catatan

    Karena mengumpulkan data memori dapat memengaruhi performa penelusuran kesalahan aplikasi asli atau mode campuran Anda, snapshot memori dinonaktifkan secara default. Untuk mengaktifkan snapshot di aplikasi asli atau mode campuran, mulai sesi penelusuran kesalahan (Kunci pintasan: F5). Saat jendela Alat Diagnostik muncul, pilih tab Penggunaan Memori, lalu pilih Pemrofilan Timbunan.

    Screenshot of Enable snapshots.

    Hentikan (Tombol pintasan: Shift+F5) dan mulai ulang penelusuran kesalahan.

  6. Untuk mengambil snapshot di awal sesi penelusuran kesalahan Anda, pilih Ambil snapshot pada toolbar ringkasan Penggunaan Memori. (Ini juga dapat membantu mengatur titik henti di sini.)

    Screenshot of Take Snapshot button.

    Screenshot of Take Snapshot button.

    Tip

    Untuk membuat garis besar perbandingan memori, pertimbangkan untuk mengambil snapshot di awal sesi penelusuran kesalahan Anda.

  7. Jalankan skenario yang akan menyebabkan titik henti pertama Anda terkena.

  8. Saat penelusur kesalahan dijeda pada titik henti pertama, pilih Ambil snapshot pada toolbar ringkasan Penggunaan Memori.

  9. Tekam F5 untuk menjalankan aplikasi ke titik henti kedua Anda.

  10. Sekarang, ambil snapshot lain.

    Pada titik ini, Anda dapat mulai menganalisis data.

    Jika Anda mengalami masalah saat mengumpulkan atau menampilkan data, lihat Memecahkan masalah kesalahan pembuatan profil dan memperbaiki masalah.

Menganalisis penggunaan memori

Baris tabel ringkasan Penggunaan Memori mencantumkan rekam jepret yang telah Anda ambil selama sesi penelusuran kesalahan dan menyediakan tautan ke tampilan yang lebih terperinci.

Screenshot of Memory Usage table.

Screenshot of Memory Usage table.

Nama kolom tergantung pada mode penelusuran kesalahan yang Anda pilih di properti proyek: .NET, native, atau mixed (baik .NET maupun native).

  • Kolom Objek (Diff) dan Alokasi (Diff) menampilkan jumlah objek di .NET dan memori asli saat snapshot diambil.

  • Kolom Heap Size (Diff) menampilkan jumlah byte di .NET dan heap asli

Saat Anda telah mengambil beberapa snapshot, sel tabel ringkasan menyertakan perubahan nilai antara snapshot baris dan snapshot sebelumnya.

Untuk menganalisis penggunaan memori, klik salah satu tautan yang membuka laporan terperinci tentang penggunaan memori:

  • Untuk melihat detail perbedaan antara rekam jepret saat ini dan rekam jepret sebelumnya, pilih tautan ubah di sebelah kiri panah (Memory Usage Increase). Panah merah menunjukkan peningkatan penggunaan memori, dan panah hijau menunjukkan penurunan.

Tip

Untuk membantu mengidentifikasi masalah memori dengan lebih cepat, laporan diff diurutkan menurut jenis objek yang meningkatkan jumlah keseluruhan terbanyak (klik tautan perubahan di kolom Objek (Diff)) atau yang meningkatkan paling banyak dalam ukuran tumpukan keseluruhan (klik tautan perubahan di kolom Ukuran Timbunan (Diff)).

  • Untuk melihat detail snapshot yang dipilih saja, klik tautan non-perubahan.

    Laporan muncul di jendela terpisah.

Laporan jenis terkelola

Pilih tautan saat ini dari sel Objek (Diff) atau Alokasi (Diff) dalam tabel ringkasan Penggunaan Memori.

Screenshot of managed type report.

Screenshot of managed type report.

Panel atas memperlihatkan jumlah dan ukuran jenis dalam snapshot, termasuk ukuran semua objek yang dirujuk oleh jenis (Ukuran Inklusif).

Pohon Jalur ke Akar di panel bawah menampilkan objek yang mereferensikan jenis yang dipilih di panel atas. Pengumpul sampah .NET membersihkan memori untuk objek hanya ketika jenis terakhir yang mereferensikannya telah dirilis.

Pohon Objek Yang Referensikan menampilkan referensi yang ditahan oleh jenis yang dipilih di panel atas.

Screenshot of Referenced Objects report.

Pohon Jenis Yang Direferensikan menampilkan referensi yang ditahan oleh jenis yang dipilih di panel atas.

Screenshot of Referenced Objects report.

Untuk menampilkan instans jenis yang dipilih di panel atas, klik "Tampilkan Instans" di samping jenis objek.

Screenshot of the Instances view in the Memory Usage tool.

Screenshot of the Instances view in the Memory Usage tool.

Tampilan Instans menampilkan instans objek yang dipilih dalam snapshot di panel atas. Panel Jalur ke Akar dan Objek Yang Referensikan menampilkan objek yang mereferensikan instans yang dipilih dan jenis yang dirujuk instans yang dipilih. Saat penelusur kesalahan dihentikan pada titik di mana snapshot diambil, Anda dapat mengarahkan kursor ke sel Nilai untuk menampilkan nilai objek dalam tip alat.

Laporan jenis asli

Pilih tautan saat ini dari sel Alokasi (Diff) atau Ukuran Timbunan (Diff) dalam tabel ringkasan Penggunaan Memori dari jendela Alat Diagnostik.

Screenshot of Native Type View.

Screenshot of Native Type View.

Tampilan Jenis menampilkan jumlah dan ukuran jenis dalam snapshot.

  • Pilih ikon instans (The instance icon in the Object Type column) dari jenis yang dipilih untuk menampilkan informasi tentang objek jenis yang dipilih dalam rekam jepret.

    Tampilan Instans menampilkan setiap instans dari jenis yang dipilih. Memilih instans menampilkan tumpukan panggilan yang menghasilkan pembuatan instans di panel Tumpukan Panggilan Alokasi.

    Screenshot of the Instances view and Allocation Call Stack pane.

  • Pilih Tampilkan Instans di samping jenis yang dipilih untuk menampilkan informasi tentang objek dari jenis yang dipilih dalam snapshot.

    Tampilan Instans menampilkan setiap instans dari jenis yang dipilih. Memilih instans menampilkan tumpukan panggilan yang menghasilkan pembuatan instans di panel Tumpukan Panggilan Alokasi.

    Screenshot of the Instances view and Allocation Call Stack pane.

  • Pilih Tampilan Tumpukan di daftar Mode Tampilan untuk melihat tumpukan alokasi untuk jenis yang dipilih.

    Screenshot of Stacks view.

  • Pilih Tumpukan untuk melihat tumpukan alokasi untuk jenis yang dipilih.

    Screenshot of Stacks view.

Wawasan Penggunaan Memori

Untuk memori terkelola, alat Analisis Memori juga memberikan beberapa wawasan otomatis bawaan yang kuat. Pilih tab Insight di laporan Jenis terkelola dan menampilkan wawasan otomatis yang berlaku seperti String duplikat, array Sparse, dan kebocoran Penanganan aktivitas.

Screenshot of the insight view in the Memory Usage tool.

Bagian String Duplikat memperlihatkan daftar string yang dialokasikan beberapa kali pada timbunan. Selain itu, bagian ini menunjukkan total memori yang terbuang, yaitu , (jumlah instans - 1) kali ukuran string.

Bagian Array Sparse menunjukkan array yang sebagian besar diisi dengan elemen nol, yang dapat tidak efisien dalam hal performa dan penggunaan memori. Alat analisis memori akan secara otomatis mendeteksi array ini dan menunjukkan kepada Anda berapa banyak memori yang terbuang karena nilai nol ini.

Bagian Kebocoran Penanganan Aktivitas, tersedia di Visual Studio 2022 versi 17.9 Pratinjau 1, menunjukkan potensi kebocoran memori yang dapat terjadi ketika satu objek berlangganan peristiwa objek lain. Jika penerbit peristiwa keluar dari pelanggan, pelanggan tetap hidup, bahkan jika tidak ada referensi lain untuk itu. Ini dapat menyebabkan kebocoran memori, di mana memori yang tidak digunakan tidak dibebaskan dengan benar, menyebabkan aplikasi menggunakan semakin banyak memori dari waktu ke waktu.

Jenis tertentu diketahui memiliki bidang yang dapat dibaca untuk menentukan ukuran memori asli yang mereka pegang. Tab Wawasan menunjukkan simpul memori asli palsu dalam grafik objek, yang dipertahankan oleh objek induknya sehingga UI akan mengenalinya dan menampilkan ukuran dan grafik referensinya.

Screenshot of the native insight view in the Memory Usage tool.

Mengubah laporan (Diff)

  • Pilih tautan ubah di sel tabel ringkasan tab Penggunaan Memori pada jendela Alat Diagnostik.

    Screenshot of Choose a change link in a cell.

    Screenshot of Choose a change link in a cell.

  • Pilih snapshot di daftar Bandingkan Dengan laporan terkelola atau asli.

    Screenshot of Choose a snapshot from the Compare To list.

    Screenshot of Choose a snapshot from the Compare with list.

Laporan perubahan menambahkan kolom (ditandai dengan (Diff)) ke laporan dasar yang memperlihatkan perbedaan antara nilai snapshot dasar dan snapshot perbandingan. Berikut tampilan laporan diff Tampilan Tipe Asli:

Screenshot of Native Types Diff View.

Screenshot of Native Types Diff View.

Blog dan video

Menganalisis CPU dan Memori Saat Penelusuran Kesalahan

Blog Visual C++: Pemrofilan Memori di Visual C++ 2015

Langkah berikutnya

Dalam tutorial ini, Anda telah mempelajari cara mengumpulkan dan menganalisis data penggunaan memori. Jika Anda sudah menyelesaikan tur profiler, Anda mungkin ingin membaca tentang pendekatan umum untuk mengoptimalkan kode menggunakan alat pembuatan profil.

Dalam tutorial ini, Anda telah mempelajari cara mengumpulkan dan menganalisis data penggunaan memori saat penelusuran kesalahan. Anda mungkin ingin mengetahui lebih lanjut tentang menganalisis penggunaan memori dalam build rilis menggunakan Profiler Performa.