Mengukur penggunaan memori di Visual Studio (C#, Visual Basic, C++, F#)
temukan kebocoran memori dan penggunaan memori yang tidak efisien saat Anda melakukan debugging dengan alat diagnostik Penggunaan Memori yang terintegrasi dengan debugger. Alat Penggunaan Memori memungkinkan Anda mengambil satu atau beberapa rekam jepret tumpukan memori terkelola dan asli untuk membantu memahami dampak penggunaan memori dari jenis objek. Anda juga dapat menganalisis penggunaan memori tanpa debugger yang terpasang atau dengan menargetkan aplikasi yang sedang berjalan. Untuk informasi selengkapnya, lihat Jalankan alat pemprofilan pada build rilis atau debug. Untuk informasi tentang memilih alat analisis memori terbaik untuk kebutuhan Anda, lihat Memilih alat analisis memori.
Meskipun Anda dapat mengumpulkan rekam jepret memori kapan saja di alat Penggunaan Memori, Anda dapat menggunakan debugger Visual Studio untuk mengontrol bagaimana aplikasi Anda dieksekusi saat menyelidiki masalah performa. Mengatur titik henti, menjalankan langkah demi langkah, menghentikan semua, dan tindakan debugger lainnya dapat membantu Anda memfokuskan penyelidikan performa Anda pada lintasan 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 yang terintegrasi dengan debugger didukung untuk pengembangan .NET di Visual Studio, termasuk aplikasi ASP.NET, ASP.NET Core, pengembangan asli dan C++, serta aplikasi mode campuran (.NET dan asli).
Dalam tutorial ini, Anda akan:
- Mengambil cuplikan memori
- Menganalisis data penggunaan memori
Jika Penggunaan Memori tidak memberi Anda data yang Anda butuhkan, alat pembuatan profil lainnya di Profiler Kinerja 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, UI penyajian, atau waktu permintaan jaringan.
Nota
Dukungan Alokator Kustom Profiler memori asli bekerja dengan mengumpulkan alokasi data peristiwa ETW yang dikeluarkan selama run time. Alokator di CRT dan Windows SDK telah dianotasi di tingkat sumber sehingga data alokasi mereka dapat ditangkap. Jika Anda menulis alokator Anda sendiri, maka fungsi apa pun yang mengembalikan pointer ke memori tumpukan 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.
Saran
Karena mungkin sulit untuk mengambil profil memori dari operasi yang menarik minat Anda ketika aplikasi Anda sering mengalokasikan dan mende-alokasikan memori, atur titik henti di awal dan akhir operasi (atau menjalankan langkah demi langkah operasi) untuk menemukan titik yang tepat di mana memori berubah.
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-Alat pada toolbar.
Klik Debug / Mulai Debugging (atau Mulai pada toolbar, atau F5).
Setelah aplikasi selesai dimuat, tampilan Ringkasan Alat Diagnostik muncul.
Nota
Karena mengumpulkan data memori dapat memengaruhi performa penelusuran kesalahan aplikasi asli atau mode campuran Anda, rekam jepret memori dinonaktifkan secara default. Untuk mengaktifkan cuplikan di aplikasi asli atau mode campuran, mulai sesi debugging (Kunci pintasan: F5). Saat jendela Alat Diagnostik muncul, pilih tab Penggunaan Memori, lalu pilih Heap Profiling.
Hentikan (Tombol pintasan: Shift+F5) dan mulai ulang debugging.
Nota
Karena mengumpulkan data memori dapat memengaruhi performa penelusuran kesalahan aplikasi asli atau mode campuran Anda, cuplikan memori dinonaktifkan secara bawaan. Untuk mengaktifkan cuplikan di aplikasi asli atau campuran, mulailah sesi debugging (Kunci pintasan: F5). Saat jendela Alat Diagnostik muncul, pilih tab Penggunaan Memori, lalu pilih Heap Profiling.
Hentikan (Tombol pintasan: Shift+F5) dan me-restart debugging.
Untuk mengambil cuplikan di awal sesi debugging Anda, pilih Ambil cuplikan pada toolbar ringkasan Penggunaan Memori. (Ini mungkin membantu mengatur titik henti di sini juga.)
Tips
Untuk membuat dasar acuan untuk perbandingan memori, pertimbangkan untuk mengambil snapshot di awal sesi debugging Anda.
Jalankan skenario yang akan menyebabkan titik henti pertama Anda tercapai.
Saat debugger dijeda pada titik henti pertama, pilih Ambil rekam jepret pada toolbar ringkasan Penggunaan Memori.
Tekan F5 untuk menjalankan aplikasi hingga titik henti kedua Anda.
Sekarang, ambil rekam jepret 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 data penggunaan memori
Baris tabel ringkasan Penggunaan Memori mencantumkan snapshot yang telah Anda ambil selama sesi debugging dan menyediakan tautan ke tampilan yang lebih terperinci.
Nama kolom tergantung pada mode penelusuran kesalahan yang Anda pilih pada properti proyek: .NET, asli, atau campuran (baik .NET maupun asli).
Kolom Objects (Diff) (.NET) atau Allocations (Diff) (C++) menampilkan jumlah objek dalam .NET atau memori asli saat rekam jepret diambil.
Kolom Ukuran Heap (Diff) menampilkan jumlah byte dalam heap .NET dan asli
Saat Anda telah mengambil beberapa rekam jepret, sel tabel ringkasan menyertakan perubahan nilai antara rekam jepret baris dan rekam jepret 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 perubahan di sebelah kiri panah (
). Panah merah menunjukkan peningkatan penggunaan memori, dan panah hijau menunjukkan penurunan.
Saran
Untuk membantu mengidentifikasi masalah memori dengan lebih cepat, laporan diff diurutkan menurut jenis objek yang meningkatkan jumlah keseluruhan terbanyak (klik tautan perubahan di Objek (Diff) kolom) atau yang meningkatkan ukuran tumpukan keseluruhan paling banyak (klik tautan perubahan di Ukuran Timbunan (Diff) kolom).
Klik tautan tanpa perubahan untuk melihat detail hanya dari cuplikan yang dipilih.
Laporan muncul di jendela terpisah.
Laporan jenis yang dikelola
Pilih tautan saat ini dari sel Objek (Diff) dalam tabel ringkasan Penggunaan Memori.
Nota
Untuk kode .NET, ikon Lihat Instans () hanya tersedia saat menggunakan alat Penggunaan Memori yang terintegrasi dengan debugger atau saat Anda membuka snapshot heap dan memilih Debug Memori Terkelola .
Panel atas memperlihatkan jumlah dan ukuran tipe dalam cuplikan, termasuk ukuran semua objek yang dirujuk oleh tipe tersebut (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. Untuk informasi selengkapnya tentang cara menggunakan pohon Paths to Root, lihat Analisis jalur utama ke root.
Panel atas memperlihatkan jumlah dan besar jenis dalam cuplikan, termasuk besar semua objek yang dirujuk oleh jenis tersebut (Ukuran Inklusif).
Pohon Jalur ke Akar di panel bawah menampilkan objek yang mereferensikan tipe yang dipilih di panel atas. Pengumpul sampah .NET hanya membersihkan memori untuk objek ketika tipe terakhir yang mereferensikannya telah dirilis.
Pohon Tipe Referensi menampilkan referensi yang dimiliki oleh tipe yang dipilih di panel atas.
Pohon Tipe Referensi menampilkan referensi yang dipegang oleh tipe yang dipilih di panel atas.
Untuk menampilkan instans jenis yang dipilih di panel atas, klik ikon Tampilkan Instans di samping jenis objek.
Tampilan Instans menampilkan instans objek yang dipilih dalam cuplikan di panel atas. Panel Jalur ke Akar dan Objek Referensi menampilkan objek yang mereferensikan instans yang dipilih dan jenis yang dirujuk instans yang dipilih. Saat debugger dihentikan pada titik di mana snapshot diambil, Anda dapat mengarahkan mouse ke sel Nilai untuk menampilkan nilai objek dalam tooltip.
Tampilan Instans menampilkan instance objek yang dipilih dalam cuplikan di panel atas. Panel Jalur ke Akar dan Objek Referensi menampilkan objek yang mereferensikan instans yang dipilih dan jenis yang dirujuk instans yang dipilih. Saat debugger dihentikan pada titik di mana cuplikan diambil, Anda dapat mengarahkan mouse ke atas sel Nilai untuk menampilkan nilai objek dalam tooltip.
Laporan tipe asli
Pilih tautan saat ini dari sel Alokasi (Diff) atau Ukuran Heap (Diff) dalam tabel ringkasan Penggunaan Memori dari jendela Alat Diagnostik.
Tampilan Jenis menampilkan jumlah dan ukuran jenis dalam rekam jepret.
Pilih ikon Tampilkan Instans di samping jenis yang dipilih untuk menampilkan informasi tentang objek jenis yang dipilih dalam rekam jepret.
Tampilan Instans menampilkan setiap instans dari tipe yang dipilih. Memilih instans menampilkan tumpukan panggilan yang digunakan untuk membuat instans di panel Allocation Call Stack. (Informasi ini hanya tersedia saat debugging.)
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 sebuah entitas akan menampilkan tumpukan panggilan yang berujung pada proses pembuatan entitas tersebut di panel Allocation Call Stack.
Pilih Tampilan Tumpukan di daftar Mode Tampilan 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 Wawasan di laporan jenis yang dikelola dan menampilkan wawasan otomatis yang berlaku seperti String duplikat, Array sparse, dan Kebocoran penangan acara.
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 Sparse Arrays 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 Event Handler Leaks, tersedia di Visual Studio 2022 versi 17.9 Pratinjau versi 1, menunjukkan potensi kebocoran memori yang dapat terjadi ketika satu objek mendaftarkan peristiwa objek lain. Jika penyelenggara acara hidup lebih lama dari pelanggan, pelanggan tetap ada, bahkan jika tidak ada referensi lain untuknya. 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 Insights menunjukkan simpul memori bawaan yang palsu dalam grafik objek yang dipertahankan oleh objek induknya, memungkinkan UI untuk mengenalinya dan menampilkan ukuran serta grafik referensinya.
Laporan Perubahan (Perbedaan)
Pilih tautan ganti di sel tabel ringkasan tab Penggunaan Memori pada jendela Alat Diagnostik.
Pilih cuplikan dalam daftar Bandingkan Dengan untuk laporan terkelola atau asli.
Laporan perubahan menambahkan kolom (ditandai dengan (Diff) ) ke laporan dasar yang memperlihatkan perbedaan antara nilai rekam jepret dasar dan rekam jepret perbandingan. Beginilah tampilan laporan perbedaan Tampilan Jenis Asli:
Panel atas memperlihatkan jumlah dan ukuran tipe dalam cuplikan, termasuk ukuran semua objek yang dirujuk oleh tipe (Ukuran Inklusif).
Blog dan video
Menganalisis CPU dan Memori Saat Debugging
Visual C++ Blog: Pembuatan Profil 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 melakukan debugging. Anda mungkin ingin mengetahui lebih lanjut tentang menganalisis penggunaan memori dalam build rilis menggunakan Profiler Performa.