Bagikan melalui


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

  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.

    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.

  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-Alat pada toolbar.

    Cuplikan layar Alat Diagnostik.

    Cuplikan layar Alat Diagnostik.

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

    Setelah aplikasi selesai dimuat, tampilan Ringkasan Alat Diagnostik muncul.

    Cuplikan Layar Tab Ringkasan Alat Diagnostik.

    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.

    Cuplikan layar Aktifkan rekam jepret.

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

    Cuplikan Layar Alat Diagnostik Tab Ringkasan.

    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.

    Cuplikan layar Aktifkan rekam jepret.

    Hentikan (Tombol pintasan: Shift+F5) dan me-restart debugging.

  6. 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.)

    Cuplikan layar tombol Ambil Rekam Jepret.

    Cuplikan layar tombol Ambil Rekam Jepret.

    Tips

    Untuk membuat dasar acuan untuk perbandingan memori, pertimbangkan untuk mengambil snapshot di awal sesi debugging Anda.

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

  8. Saat debugger dijeda pada titik henti pertama, pilih Ambil rekam jepret pada toolbar ringkasan Penggunaan Memori.

  9. Tekan F5 untuk menjalankan aplikasi hingga titik henti kedua Anda.

  10. 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.

Cuplikan layar tabel Penggunaan Memori.

Cuplikan layar tabel Penggunaan Memori.

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 (Peningkatan Penggunaan Memori). 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.

Cuplikan layar laporan jenis terkelola.

Nota

Untuk kode .NET, ikon Lihat Instans (Ikon instans di kolom Jenis Objek) 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.

Cuplikan layar dari laporan tipe yang dikelola.

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.

Cuplikan layar laporan Objek Yang Dirujuk.

Pohon Tipe Referensi menampilkan referensi yang dipegang oleh tipe yang dipilih di panel atas.

Cuplikan layar laporan Objek Yang Dirujuk.

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

Cuplikan layar tampilan Instans di alat Penggunaan Memori. Tampilan Instans

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.

Cuplikan layar jendela Instances di alat Penggunaan Memori.

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.)

    Cuplikan layar tampilan Instans dan panel Tumpukan Panggilan Alokasi.

  • Pilih ikon instans (Ikon instans di kolom Jenis Objek) 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.

    Cuplikan layar tampilan Instansi dan panel Alokasi Tumpukan Panggilan.

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

    Cuplikan layar tampilan Tumpukan.

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

    Cuplikan layar tampilan Tumpukan.

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.

Cuplikan layar dari tampilan wawasan dalam fitur Penggunaan Memori. wawasan Penggunaan Memori

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.

Cuplikan layar tampilan wawasan asli di alat Penggunaan Memori.

Laporan Perubahan (Perbedaan)

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

    Cuplikan layar Pilih tautan perubahan dalam sel.

    Cuplikan layar Pilih tautan 'Perubahan' dalam sel.

  • Pilih cuplikan dalam daftar Bandingkan Dengan untuk laporan terkelola atau asli.

    Cuplikan layar Pilih cuplikan dari daftar perbandingan.

    Cuplikan layar untuk memilih rekaman jepretan dari daftar 'Bandingkan dengan'.

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:

Cuplikan Layar Tampilan Perbedaan Tipe 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.