Menganalisis penggunaan memori tanpa penelusuran kesalahan di Performance Profiler (C#, Visual Basic, C++, F#)

Alat Penggunaan Memori memantau penggunaan memori aplikasi Anda. Anda dapat menggunakan alat ini untuk mempelajari efek memori real-time dari skenario yang Anda kembangkan secara aktif di Visual Studio. Anda dapat mengambil snapshot terperinci dari status memori aplikasi, dan membandingkan snapshot untuk menemukan akar penyebab masalah memori. Alat Penggunaan Memori didukung pada aplikasi .NET, ASP.NET, C++, atau mode campuran (.NET dan asli).

Alat Penggunaan Memori dapat berjalan dengan atau tanpa debugger. Dalam artikel ini, kami menunjukkan cara menggunakan alat Penggunaan Memori tanpa debugger di Visual Studio Performance Profiler, yang direkomendasikan untuk build rilis. Untuk informasi tentang memilih alat analisis memori terbaik untuk kebutuhan Anda, lihat Memilih alat analisis memori.

Sesi diagnostik Penggunaan Memori

Untuk memulai sesi diagnostik Penggunaan Memori:

  1. Buka proyek di Visual Studio.

    Alat Penggunaan Memori mendukung aplikasi .NET, ASP.NET, C++, atau mode campuran (.NET dan asli).

  2. Di menu Debug, atur konfigurasi solusi ke Rilis dan pilih Local Windows Debugger (atau Komputer Lokal) sebagai target penyebaran.

  3. Pada bilah menu, pilih Debug>Performance Profiler.

  4. Di bawah Alat yang Tersedia, pilih Penggunaan Memori, lalu pilih Mulai.

    Start a Memory Usage diagnostic session

Memantau penggunaan memori

Saat Anda memulai sesi diagnostik, aplikasi Anda dimulai, dan jendela Alat Diagnostik menampilkan grafik garis waktu penggunaan memori aplikasi Anda.

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

Grafik garis waktu menunjukkan fluktuasi memori saat aplikasi berjalan. Lonjakan grafik biasanya menunjukkan bahwa beberapa kode mengumpulkan atau membuat data, lalu membuangnya ketika pemrosesan selesai. Lonjakan besar menunjukkan area yang dapat Anda optimalkan. Perhatian utama adalah kenaikan konsumsi memori yang tidak dikembalikan. Ini mungkin menunjukkan penggunaan memori yang tidak efisien atau bahkan kebocoran memori.

Mengambil snapshot status memori aplikasi

Aplikasi menggunakan sejumlah besar objek, dan Anda mungkin ingin mengonsentrasikan analisis Anda pada satu skenario. Atau, Anda mungkin menemukan masalah memori untuk diselidiki. Anda dapat mengambil snapshot selama sesi diagnostik untuk menangkap penggunaan memori pada saat-saat tertentu. Ada baiknya untuk mendapatkan snapshot dasar aplikasi sebelum masalah memori muncul. Anda dapat mengambil snapshot lain setelah terjadinya masalah pertama, dan snapshot tambahan jika Anda dapat mengulangi skenario.

Untuk mengumpulkan snapshot, pilih Ambil snapshot saat Anda ingin mengambil data memori.

Menutup sesi diagnostik

Untuk menghentikan sesi pemantauan tanpa membuat laporan, cukup tutup jendela diagnostik. Untuk membuat laporan saat Anda selesai mengumpulkan atau telah mengambil snapshot, pilih Hentikan Koleksi.

Stop Collection

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

Laporan Penggunaan Memori

Setelah Anda menghentikan pengumpulan data, alat Penggunaan Memori menghentikan aplikasi dan menampilkan halaman gambaran umum Penggunaan Memori.

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

Snapshot Penggunaan Memori

Angka-angka di panel Snapshot memperlihatkan objek dan byte dalam memori saat setiap snapshot diambil, dan perbedaan antara snapshot dan yang sebelumnya.

Angka tersebut adalah tautan yang membuka tampilan laporan Penggunaan Memori terperinci di jendela Visual Studio baru. Laporan detail snapshot menunjukkan jenis dan instans dalam satu snapshot. Laporan perbedaan snapshot (diff) membandingkan jenis dan instans dalam dua snapshot.

Snapshot view links

Gambar Deskripsi
Step 1 Jumlah total byte dalam memori saat snapshot diambil. Pilih tautan ini untuk menampilkan laporan detail snapshot yang diurutkan berdasarkan ukuran total instans jenis.
Step 2 Jumlah total objek dalam memori saat snapshot diambil. Pilih tautan ini untuk menampilkan laporan detail snapshot yang diurutkan berdasarkan jumlah instans jenis.
Step 3 Perbedaan antara ukuran total objek memori dalam snapshot ini dan snapshot sebelumnya. Angka positif berarti ukuran memori snapshot ini lebih besar dari yang sebelumnya, dan angka negatif berarti ukurannya lebih kecil. Garis besar berarti snapshot adalah yang pertama dalam sesi diagnostik. Tidak Ada Perbedaan berarti perbedaannya adalah nol. Pilih tautan ini untuk menampilkan laporan diff snapshot yang diurutkan berdasarkan perbedaan ukuran total instans jenis.
Step 4 Perbedaan antara jumlah total objek memori dalam snapshot ini dan snapshot sebelumnya. Pilih tautan ini untuk menampilkan laporan diff snapshot. Ini diurutkan berdasarkan perbedaan dalam jumlah total instans jenis.

Snapshot view links

Gambar Deskripsi
Step 1 Jumlah total objek dalam memori saat snapshot diambil. Pilih tautan ini untuk menampilkan laporan detail snapshot yang diurutkan berdasarkan jumlah instans jenis.
Step 2 Perbedaan antara jumlah total objek memori dalam snapshot ini dan snapshot sebelumnya. Pilih tautan ini untuk menampilkan laporan diff snapshot yang diurutkan berdasarkan perbedaan jumlah total instans jenis.
Step 3 Jumlah total byte dalam memori saat snapshot diambil. Pilih tautan ini untuk menampilkan laporan detail snapshot yang diurutkan berdasarkan ukuran total instans jenis.
Step 4 Perbedaan antara ukuran total objek memori dalam snapshot ini dan snapshot sebelumnya. Angka positif berarti ukuran memori snapshot ini lebih besar dari yang sebelumnya, dan angka negatif berarti ukurannya lebih kecil. Garis besar berarti snapshot adalah yang pertama dalam sesi diagnostik. Tidak Ada Perbedaan berarti perbedaannya adalah nol. Pilih tautan ini untuk menampilkan laporan diff snapshot yang diurutkan berdasarkan perbedaan ukuran total instans jenis.

Laporan snapshot Penggunaan Memori

Saat Anda memilih salah satu tautan snapshot di halaman gambaran umum Penggunaan Memori, laporan snapshot terbuka di halaman baru.

Memory Usage snapshot report

Memory Usage snapshot report

Jika Jenis Objek berwarna biru, Anda dapat memilihnya untuk menavigasi ke objek dalam kode sumber, di jendela terpisah.

Jenis yang tidak dapat Anda identifikasi atau yang keterlibatannya dalam kode Anda yang tidak Anda pahami mungkin adalah objek .NET, sistem operasi, atau kompilator. Alat Penggunaan Memori menampilkan objek ini jika terlibat dalam rantai kepemilikan objek Anda.

Dalam laporan snapshot:

  • Pohon Memori Terkelola menunjukkan jenis dan instans dalam laporan. Memilih jenis atau instans menampilkan pohon Jalur ke Akar dan Objek Yang Dirujuk untuk item yang dipilih.

  • Pohon Jalur ke Akar menunjukkan rantai objek yang mereferensikan jenis atau instans. Pengumpul sampah .NET membersihkan memori untuk objek hanya ketika semua referensi ke sana telah dirilis.

  • Pohon Jenis Yang Dirujuk atau Objek Yang Dirujuk menunjukkan objek yang dipilih jenis atau referensi instans.

Filter pohon laporan

Banyak jenis dalam aplikasi tidak diperlukan untuk pengembang aplikasi. Filter laporan snapshot dapat menyembunyikan sebagian besar jenis ini di Memori Terkelola dan pohon Jalur ke Akar.

Sort and filter options

Sort and filter options

  • Untuk memfilter pohon menurut nama jenis, masukkan nama dalam kotak Filter. Filter tidak peka huruf besar/kecil, dan mengenali string yang ditentukan di bagian mana pun dari nama jenis.

  • Pilih Ciutkan Objek Kecil di menu dropdown Filter untuk menyembunyikan jenis yang Ukurannya (Byte) kurang dari 0,5 persen dari total memori.

  • Pilih Hanya Kode Saya di menu dropdown Filter untuk menyembunyikan sebagian besar instans yang dihasilkan oleh kode eksternal. Jenis eksternal milik sistem operasi atau komponen kerangka kerja, atau dihasilkan oleh pengompilasi.

Laporan detail snapshot

Laporan detail snapshot menjelaskan satu snapshot dari sesi diagnostik. Untuk membuka laporan, pilih tautan ukuran atau objek di panel snapshot.

Links to snapshot report in a snapshot pane

Links to snapshot report in a snapshot pane

Kedua tautan membuka laporan yang sama. Satu-satunya perbedaan adalah urutan penyortiran awal pohon Memori Terkelola. Tautan ukuran mengurutkan laporan menurut kolom Ukuran Inklusif (Byte). Tautan objek mengurutkan laporan menurut kolom Hitung. Anda bisa mengubah kolom atau urutan pengurutan setelah laporan terbuka.

Pohon Memori Terkelola (Laporan detail snapshot)

Pohon Memori Terkelola mencantumkan jenis objek yang disimpan dalam memori. Perluas nama jenis untuk melihat 10 instans terbesar dari jenis tersebut, yang diurutkan menurut ukuran. Pilih jenis atau instans untuk menampilkan pohon Jalur ke Akar dan Objek Yang Dirujuk untuk item yang dipilih.

Managed Heap tree

Managed Memory tree

Pohon Memori Terkelola dalam laporan detail snapshot memiliki kolom berikut:

Nama Deskripsi
Jenis Objek Nama jenis atau instans objek.
Hitung Jumlah instans objek jenis. Hitungan selalu 1 untuk instans.
Ukuran (Byte) Untuk jenis, ukuran semua instans jenis dalam snapshot, lebih sedikit ukuran objek yang terkandung dalam instans. Misalnya, ukuran objek, lebih sedikit ukuran objek yang terkandung dalam instans.
Ukuran inklusif (Byte) Ukuran instans jenis, atau ukuran satu instans, termasuk ukuran objek yang terkandung.
Modul Modul yang berisi objek.

Pohon Jalur ke Akar (Laporan detail snapshot)

Pohon Jalur ke Akar menunjukkan rantai objek yang mereferensikan jenis atau instans. Pengumpul sampah .NET membersihkan memori untuk objek hanya ketika semua referensi ke sana telah dirilis.

Untuk jenis di pohon Jalur ke Akar, jumlah objek yang menyimpan referensi ke jenis tersebut muncul di kolom Jumlah Referensi.

Paths to Root tree for types

Paths to Root tree for types

Jenis Referensi atau pohon Objek Yang Dirujuk (Laporan detail snapshot)

Pohon Jenis Yang Dirujuk atau Objek Yang Dirujuk menunjukkan objek yang dipilih jenis atau referensi instans.

Referenced Objects tree for instances

Referenced Objects tree for instances

Pohon Jenis yang Dirujuk dalam laporan detail snapshot memiliki kolom berikut. Pohon Objek yang Dirujuk tidak memiliki kolom Jumlah Referensi.

Nama Deskripsi
Jenis Objek atau Instans Nama jenis atau instans.
Hitungan Referensi Untuk jenis, jumlah instans objek jenis.
Ukuran (Byte) Untuk jenis, ukuran semua instans jenis, lebih sedikit ukuran objek yang terkandung dalam jenis. Misalnya, ukuran objek, lebih sedikit ukuran objek yang terkandung dalam objek.
Ukuran inklusif (Byte) Ukuran total instans jenis, atau ukuran instans, termasuk ukuran objek yang terkandung.
Modul Modul yang berisi objek.

Laporan perbedaan snapshot (diff)

Laporan perbedaan snapshot (diff) menunjukkan perubahan antara snapshot utama dan snapshot sebelumnya. Untuk membuka laporan diff, pilih salah satu tautan perbedaan di panel snapshot.

Kedua tautan membuka laporan yang sama. Satu-satunya perbedaan adalah urutan awal pohon Memori Terkelola dalam laporan. Tautan ukuran mengurutkan laporan menurut kolom Diff Ukuran Inklusif (Byte). Tautan objek mengurutkan laporan menurut kolom Hitung Diff. Anda bisa mengubah kolom atau urutan pengurutan setelah laporan terbuka.

Links to difference report in a snapshot pane

Links to difference report in a snapshot pane

Pohon Memori Terkelola (Laporan diff snapshot)

Pohon Memori Terkelola mencantumkan jenis objek yang disimpan dalam memori. Anda dapat memperluas nama jenis untuk melihat 10 instans terbesar dari jenis tersebut, yang diurutkan menurut ukuran. Pilih jenis atau instans untuk menampilkan pohon Jalur ke Akar dan Objek Yang Dirujuk untuk item yang dipilih.

Managed Heap tree for a type in difference report

Managed Memory tree for a type in difference report

Pohon Memori Terkelola dalam laporan diff snapshot memiliki kolom berikut:

Nama Deskripsi
Jenis Objek Nama jenis atau instans objek.
Hitung Jumlah instans jenis dalam snapshot utama. Hitungan selalu 1 untuk instans.
Hitung Diff Untuk jenis, perbedaan jumlah instans jenis antara snapshot utama dan snapshot sebelumnya. Bidang kosong untuk instans.
Ukuran (Byte) Ukuran objek dalam snapshot utama, lebih sedikit ukuran objek dalam objek. Untuk jenis, Ukuran (Byte) dan Ukuran Inklusif (Byte) adalah total ukuran instans jenis.
Total Diff Ukuran (Byte) Untuk jenis, perbedaan ukuran total instans jenis antara snapshot utama dan snapshot sebelumnya, lebih sedikit ukuran objek dalam instans. Bidang kosong untuk instans.
Ukuran inklusif (Byte) Ukuran objek dalam snapshot utama, termasuk ukuran objek dalam objek.
Diff Ukuran Inklusif (Byte) Untuk jenis, perbedaan ukuran semua instans jenis antara snapshot utama dan snapshot sebelumnya, termasuk ukuran objek dalam objek. Bidang kosong untuk instans.
Modul Modul yang berisi objek.

Jalur ke Pohon akar (Laporan diff snapshot)

Pohon Jalur ke Akar menunjukkan rantai objek yang mereferensikan jenis atau instans. Pengumpul sampah .NET membersihkan memori untuk objek hanya ketika semua referensi ke sana telah dirilis.

Untuk jenis di pohon Jalur ke Akar, jumlah objek yang menyimpan referensi ke jenis tersebut muncul di kolom Jumlah Referensi. Perbedaan jumlah dari snapshot sebelumnya ada di kolom Referensi Diff.

Paths To Root tree in a diff report

Paths To Root tree in a diff report

Jenis Referensi atau pohon Objek Yang Dirujuk (Laporan perbedaan snapshot)

Pohon Jenis Yang Dirujuk atau Objek Yang Dirujuk menunjukkan objek yang dipilih jenis atau referensi instans.

Referenced Types in a diff report

Referenced Types in a diff report

Pohon Jenis yang Dirujuk dalam laporan diff snapshot memiliki kolom berikut. Pohon Objek yang Dirujuk memiliki kolom Instans, Ukuran (Byte), Ukuran Inklusif (Byte), dan Modul.

Nama Deskripsi
Jenis Objek atau Instans Nama jenis atau instans objek.
Hitungan Referensi Jumlah instans jenis dalam snapshot utama.
Diff Jumlah Referensi Untuk jenis, perbedaan jumlah instans jenis antara snapshot utama dan snapshot sebelumnya.
Ukuran (Byte) Ukuran objek dalam snapshot utama, lebih sedikit ukuran objek dalam objek. Untuk jenis, Ukuran (Byte) dan Ukuran Inklusif (Byte) adalah total ukuran instans jenis.
Total Diff Ukuran (Byte) Untuk jenis, perbedaan ukuran total instans jenis antara snapshot utama dan snapshot sebelumnya, lebih sedikit ukuran objek dalam instans.
Ukuran inklusif (Byte) Ukuran objek dalam snapshot utama, termasuk ukuran objek dalam objek.
Diff Ukuran Inklusif (Byte) Untuk jenis, perbedaan ukuran semua instans jenis antara snapshot utama dan snapshot sebelumnya, termasuk ukuran objek dalam objek.
Modul Modul yang berisi objek.

Laporan wawasan

Di Visual Studio 2022, alat Analisis Memori juga memberikan beberapa wawasan otomatis bawaan yang kuat untuk memori terkelola. Pilih tab Insight di laporan Jenis terkelola dan menampilkan wawasan otomatis yang berlaku seperti String duplikat, array Sparse, dan kebocoran Penanganan aktivitas. Untuk informasi selengkapnya, lihat Insight Penggunaan Memori.

Screenshot of Managed memory insights.