Bagikan melalui


Mengukur penggunaan memori dalam 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 Memory Usage, Anda dapat menggunakan debugger Visual Studio untuk mengontrol bagaimana aplikasi Anda dijalankan 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.

Saran

Anda juga dapat menggunakan GitHub Copilot Profiler Agent untuk mendapatkan panduan berbasis AI untuk mengumpulkan dan menganalisis jejak memori.

Penting

Alat Diagnostik yang terintegrasi dengan debugger didukung untuk pengembangan .NET di Visual Studio, termasuk aplikasi ASP.NET, ASP.NET Core, pengembangan native/C++, dan mode campuran (.NET dan native).

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 data peristiwa ETW yang dihasilkan selama waktu berjalan. 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 project 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 DebugWindowsTampilkan Alat Diagnostik.

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

    Cuplikan layar jendela Alat Diagnostik dengan alat Penggunaan Memori dipilih di menu dropdown Pilih Alat.

    Cuplikan layar jendela Alat Diagnostik dengan alat Penggunaan Memori dipilih di menu dropdown Pilih Alat.

  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 memperlihatkan grafik garis waktu Penggunaan Memori dan bagan memori proses.

    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 toolbar Penggunaan Memori dengan tombol Heap Profiling disorot untuk mengaktifkan rekam jepret untuk aplikasi asli atau mode campuran.

    Hentikan (Tombol pintasan: ShiftF5) dan mulai ulang debugging.

    Cuplikan layar tab Ringkasan Alat Diagnostik memperlihatkan grafik garis waktu Penggunaan Memori dan bagan memori proses.

    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 toolbar Penggunaan Memori dengan tombol Heap Profiling disorot untuk mengaktifkan rekam jepret untuk aplikasi asli atau mode campuran.

    Hentikan (Tombol pintasan: ShiftF5) dan mulai ulang 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 toolbar ringkasan Penggunaan Memori dengan tombol Ambil Rekam Jepret.

    Saran

    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 ringkasan Penggunaan Memori memperlihatkan dua rekam jepret dengan kolom untuk Objek, Ukuran Timbunan, dan perbedaannya.

Nama kolom tergantung pada mode debugging yang dipilih di properti proyek: .NET, native, atau campuran (baik .NET maupun native).

  • Kolom Objects (Diff) (.NET) atau Allocations (Diff) (C++) menampilkan jumlah objek dalam memori .NET atau asli saat rekam jepret diambil.

  • Kolom Heap Size (Diff) menampilkan jumlah byte dalam tumpukan .NET dan native

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 MemoriPeningkatan 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.Laporan jenis terkelola

Nota

Untuk kode .NET, ikon View Details (Tampilan instans di kolom Object Type) hanya tersedia saat menggunakan alat Penggunaan Memori terintegrasi debugger atau saat Anda membuka rekam jepret 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 sebuah objek hanya ketika tipe terakhir yang mereferensinya telah dirilis. Untuk informasi selengkapnya tentang cara menggunakan pohon Paths to Root, lihat Analisis jalur utama ke root.

Cuplikan layar laporan jenis terkelola.Laporan jenis terkelola

Nota

Untuk kode .NET, ikon View Instances (Ikon instans di kolom Object Type) hanya tersedia ketika menggunakan alat Penggunaan Memori yang terintegrasi dengan debugger atau saat Anda membuka heap snapshot 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 sebuah objek hanya ketika tipe terakhir yang mereferensinya telah dirilis. Untuk informasi selengkapnya tentang cara menggunakan pohon Paths to Root, lihat Analisis jalur utama ke root.

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 dimiliki 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 Detail di samping jenis objek.

Cuplikan layar tampilan Instans di alat Penggunaan Memori. Tampilan Instansdi alat Penggunaan Memori

Tampilan Instans menampilkan instans objek yang dipilih dalam cuplikan di panel atas. Panel Jalur ke Akar dan Objek yang Direferensikan menampilkan objek-objek yang mereferensikan instans yang dipilih dan jenis-jenis yang dirujuk oleh 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.

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 Instansdi alat Penggunaan Memori

Tampilan Instans menampilkan instans objek yang dipilih dalam cuplikan di panel atas. Panel Jalur ke Akar dan Objek yang Direferensikan menampilkan objek-objek yang mereferensikan instans yang dipilih dan jenis-jenis yang dirujuk oleh 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.

Laporan tipe asli

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

Cuplikan layar Tampilan Tipe Asli.

Cuplikan layar Tampilan Tipe Asli.

Tampilan Jenis menampilkan jumlah dan ukuran jenis dalam rekam jepret.

  • Pilih ikon Tampilkan Detail 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 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 Tumpukan untuk melihat tumpukan alokasi untuk jenis yang dipilih.

    Cuplikan layar tampilan Tumpukan.

  • Pilih Tumpukan 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.Memory Usage insight wawasan Penggunaan Memori

Cuplikan layar dari tampilan wawasan dalam fitur Penggunaan Memori.Memory Usage insight 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 1, menunjukkan potensi kebocoran memori yang dapat terjadi ketika satu objek berlangganan ke acara dari objek lain. Jika publisher dari acara tetap ada lebih lama dari subscriber, subscriber tetap hidup, 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.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 tabel ringkasan Penggunaan Memori dengan tautan perubahan disorot dalam sel rekam jepret.

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

    Cuplikan layar daftar pilihan Bandingkan Dengan dalam laporan Penggunaan Memori, memperlihatkan cuplikan yang tersedia untuk perbandingan.

    Cuplikan layar daftar pilihan Bandingkan Dengan dalam laporan Penggunaan Memori, memperlihatkan cuplikan yang tersedia untuk perbandingan.

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 Jenis Asli.Tampilan Perbedaan Jenis Asli

Cuplikan Layar Tampilan Perbedaan Jenis Asli.Tampilan Perbedaan Jenis Asli

Panel atas memperlihatkan jumlah dan ukuran tipe dalam cuplikan, termasuk ukuran semua objek yang dirujuk oleh tipe tersebut (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 saat melakukan debugging. Berikut adalah beberapa langkah berikutnya yang disarankan:

  • Untuk menganalisis penggunaan memori dalam build rilis, lihat Menganalisis penggunaan memori di Profiler Performa.
  • Untuk mempelajari pendekatan umum untuk mengoptimalkan kode menggunakan alat pembuatan profil, lihat Studi kasus: Panduan pemula untuk mengoptimalkan kode.
  • Untuk mendapatkan panduan pembuatan profil berbasis AI, lihat Profile aplikasi Anda dengan GitHub Copilot Profiler Agent.
  • Untuk gambaran umum semua alat pembuatan profil, lihat Pertama-tama lihat alat pembuatan profil.