Bagaimana mengidentifikasi memori kebocoran dalam common language runtime

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 318263 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Artikel ini membahas kebocoran memori apa yang dan daftar beberapa mungkin menyebabkan kebocoran memori. Selain itu, artikel ini membahas kebocoran memori yang dirasakan dan bagaimana hal itu dapat disalahartikan sebagai kebocoran memori benar.

INFORMASI LEBIH LANJUT

Kebocoran memori dapat menyebabkan sebuah aplikasi untuk lari keluar dari sumber daya dan dapat menyebabkan sebuah aplikasi untuk crash. Penting untuk mengidentifikasi kebocoran memori. Masalah kebocoran memori telah menjangkiti pengembang dalam c dan c ++ selama bertahun-tahun. Microsoft Visual Studio 2005 atau Microsoft Visual Studio.NET, pengumpulan sampah komprehensif paket dan dikelola memori dapat menghentikan kebocoran memori, tetapi, di bawah beberapa keadaan, program mungkin muncul untuk menjadi bocor memori.

Definisi kebocoran memori

Sebuah kebocoran memori terjadi ketika memori dialokasikan dalam program dan tidak pernah kembali ke sistem operasi, meskipun program tidak menggunakan memori lagi. Berikut adalah empat jenis dasar kebocoran memori:
  • Di lingkungan secara manual dikelola memori: memori dialokasikan secara dinamis dan direferensikan oleh pointer. Pointer dihapus sebelum memori dibebaskan. Setelah pointer terhapus, memori tidak lagi dapat diakses dan karena itu tidak dapat dibebaskan.
  • Di lingkungan memori dinamis dikelola: memori dibuang tapi tidak pernah dikumpulkan, karena referensi ke objek masih aktif. Karena referensi ke objek masih aktif, sampah kolektor tidak pernah mengumpulkan bahwa memori. Hal ini dapat terjadi dengan referensi yang ditetapkan oleh sistem atau program.
  • Di lingkungan memori dinamis dikelola: sampah kolektor dapat mengumpulkan dan gratis memori tetapi tidak pernah kembali itu untuk operasi sistem. Hal ini terjadi ketika garbage collector tidak dapat memindahkan objek yang masih dalam menggunakan satu bagian dari memori dan membebaskan sisa.
  • Dalam lingkungan memori: manajemen memori miskin dapat hasil ketika banyak benda besar yang dinyatakan dan tidak pernah diizinkan untuk meninggalkan ruang lingkup. Sebagai hasilnya, memori digunakan dan tidak pernah dibebaskan.

Diskusi

Karena dari sampah kumpulan paket yang dilaksanakan di Microsoft.NET Framework, tidak mungkin untuk memiliki kebocoran memori di kode dikelola. Ini menunjukkan dua pertanyaan: Bagaimana kemudian dapat kebocoran memori terjadi? Mengapa itu muncul bahwa Anda memiliki kebocoran memori?

Kebocoran memori dapat terjadi di.NET Framework aplikasi ketika Anda menggunakan kode tidak dikelola sebagai bagian dari aplikasi. Kode ini tidak dikelola dapat kebocoran memori, dan.NET Framework Runtime tidak dapat mengatasi masalah.

Selain itu, proyek mungkin hanya tampaknya memiliki kebocoran memori. Kondisi ini dapat terjadi jika banyak besar objek (seperti DataTable objek) yang dinyatakan dan kemudian ditambahkan ke koleksi (seperti DataSet). Sumber daya yang objek ini sendiri mungkin tidak pernah dirilis, dan sumber daya yang tersisa hidup untuk seluruh menjalankan program. Hal ini tampaknya menjadi kebocoran, tetapi sebenarnya hanya gejala cara bahwa memori menjadi dialokasikan dalam program.

Misalnya, Anda memiliki DataSet. Setiap kali permintaan baru dijalankan, Anda menambahkan baru DataTable unsur yang DataSet untuk menyimpan data yang dikembalikan. Jika ada sejumlah besar data yang Anda tidak pernah membuang, data tetap hidup selama DataSet ini masih digunakan. Jika hal ini terjadi cukup kali, itu mungkin untuk kehabisan memori. Hal ini tidak kebocoran memori, tetapi sebaliknya ini adalah masalah di mengelola memori. Lihat contoh kode berikut:
  Dim DS As DataSet
  Dim cn As New SqlClient.SqlConnection("data source=localhost;initial catalog=Northwind;integrated security=SSPI")
  cn.Open()
 
  Dim da As New SqlClient.SqlDataAdapter("Select * from Employees", cn)
  Dim i As Integer
  DS = New DataSet()

  For i = 0 To 1000
      da.Fill(DS, "Table" + i.ToString)
  Next
				
Catatan Contoh ini adalah hanya potongan kode. Contoh ini mengasumsikan Microsoft SQL Server terinstal di komputer lokal dan bahwa pengguna Siapa yang menjalankan kode ini memiliki akses ke Northwind database yang disertakan dengan SQL Server.

Meskipun kode ini jelas tidak efisien dan tidak praktis, hal ini dimaksudkan untuk menunjukkan bahwa jika objek yang ditambahkan ke koleksi (seperti menambahkan tabel untuk DataSet Koleksi), objek disimpan aktif selama Koleksi tetap hidup. Jika koleksi menyatakan pada tingkat global program, dan objek yang dinyatakan di seluruh program dan ditambahkan ke itu Koleksi, ini berarti bahwa meskipun benda-benda yang tidak lagi dalam lingkup, objek tetap hidup karena mereka masih menjadi direferensikan.

Setiap saat ini terjadi, jumlah memori yang program menggunakan meningkatkan. Memori tidak mengurangi sampai akhir program atau rilis objek dari koleksi. Ketika Anda menonton program pada monitor kinerja, ini tampaknya kebocoran memori, tapi tidak. The program masih memiliki kontrol atas memori tetapi telah memilih untuk tidak melepaskan itu. The fakta bahwa program ini masih memiliki kontrol mencegah ini menjadi kebocoran memori, tapi fakta bahwa program terus meningkat jumlah memori yang digunakan dapat membuatnya tampak kebocoran memori.

Gejala kebocoran memori

Ketika jumlah memori yang program menggunakan terus meningkatkan selama pelaksanaan, ini adalah gejala kebocoran memori. (Anda dapat menonton perhitungan ini memori melalui monitor kinerja.) Jumlah memori program menggunakan akhirnya dapat menyebabkan program kehabisan sumber daya dan crash.

REFERENSI

Berikut adalah daftar topik bantuan untuk informasi lebih lanjut tentang memori dan manajemen:
  • Kelas GC
  • Penghitung kinerja memori
  • Otomatis manajemen memori
  • Interoperasi dengan kode tidak dikelola
Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
317297Peta jalan untuk debugging hang, kebocoran memori, deadlock, dan ras kondisi dalam Visual Basic.NET
Untuk informasi lebih lanjut, kunjungi Website Microsoft berikut Situs Web Developer Network (MSDN):
http://MSDN.Microsoft.com/en-us/library/x98tx3cf.aspx

http://MSDN.Microsoft.com/en-us/library/fz5w87ad.aspx

http://MSDN.Microsoft.com/en-us/library/kxx6e7z6.aspx

http://MSDN.Microsoft.com/en-us/library/s3aw423e.aspx

Properti

ID Artikel: 318263 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Professional Edition
  • Microsoft Visual Studio .NET 2003 Professional Edition
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
  • Microsoft Visual Studio .NET 2003 Academic Edition
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual Studio .NET 2002 Enterprise Architect
  • Microsoft Visual Studio .NET 2002 Enterprise Developer
  • Microsoft Visual Studio .NET 2002 Academic Edition
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual J# .NET 2003 Standard Edition
Kata kunci: 
kbvs2005swept kbvs2005applies kbinfo kbmt KB318263 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:318263

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com