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
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.
Atur titik henti kedua di akhir fungsi atau wilayah kode yang ingin Anda analisis (atau setelah masalah memori yang dicurigai terjadi).
Jendela Alat Diagnostik muncul secara otomatis kecuali Anda telah menonaktifkannya. Untuk memunculkan jendela lagi, klik Debug>Windows>Tampilkan Alat Diagnostik.
Pilih Penggunaan Memori dengan pengaturan Pilih Alat pada toolbar.
Klik Debug / Mulai Penelusuran Kesalahan (atau Mulai pada toolbar, atau F5).
Saat aplikasi selesai memuat, tampilan Ringkasan Alat Diagnostik muncul.
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.
Hentikan (Tombol pintasan: Shift+F5) dan mulai ulang penelusuran kesalahan.
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.
Hentikan (Tombol pintasan: Shift+F5) dan mulai ulang penelusuran kesalahan.
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.)
Tip
Untuk membuat garis besar perbandingan memori, pertimbangkan untuk mengambil snapshot di awal sesi penelusuran kesalahan Anda.
Jalankan skenario yang akan menyebabkan titik henti pertama Anda terkena.
Saat penelusur kesalahan dijeda pada titik henti pertama, pilih Ambil snapshot pada toolbar ringkasan Penggunaan Memori.
Tekam F5 untuk menjalankan aplikasi ke titik henti kedua Anda.
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.
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 (). 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.
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.
Pohon Jenis Yang Direferensikan menampilkan referensi yang ditahan oleh jenis yang dipilih di panel atas.
Untuk menampilkan instans jenis yang dipilih di panel atas, klik "Tampilkan Instans" di samping jenis objek.
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.
Tampilan Jenis menampilkan jumlah dan ukuran jenis dalam snapshot.
Pilih ikon instans () 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.
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.
Pilih Tampilan Tumpukan di daftar Mode Tampilan untuk melihat tumpukan alokasi untuk jenis yang dipilih.
Pilih Tumpukan untuk melihat tumpukan alokasi untuk jenis yang dipilih.
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.
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.
Mengubah laporan (Diff)
Pilih tautan ubah di sel tabel ringkasan tab Penggunaan Memori pada jendela Alat Diagnostik.
Pilih snapshot di daftar Bandingkan Dengan laporan terkelola atau asli.
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:
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.