Kebocoran memori ialah situasi yang berlaku apabila program atau aplikasi menggunakan memori utama sistem dalam tempoh yang lama. Apabila atur cara tidak melepaskan memori yang diduduki olehnya semasa pelaksanaan, walaupun selepas ia menyelesaikan proses pelaksanaannya, maka ruang memori yang diperuntukkan ini merendahkan prestasi sistem dan boleh menjadikannya tidak bertindak balas. Dalam topik ini, kita akan belajar tentang C# Memory Leak.
Adalah menjadi tanggungjawab pemungut sampah untuk membebaskan memori yang diperuntukkan yang tidak digunakan, tetapi kami masih menghadapi masalah kebocoran memori kerana kadangkala kami merujuk objek yang tidak digunakan daripada pembolehubah yang tidak pernah keluar dari skop sepanjang hayat aplikasi.
Sintaks
Terdapat banyak cara untuk mengelakkan kebocoran memori dalam C#; kita boleh mengelakkan kebocoran memori semasa bekerja dengan sumber yang tidak terurus dengan bantuan pernyataan 'menggunakan', yang secara dalaman memanggil kaedah Dispose(). Sintaks untuk pernyataan 'menggunakan' adalah seperti berikut:
using(var objectName = new AnyDisposableType) { //user code }
Dalam pernyataan di atas, ‘var’ ialah kata kunci yang digunakan untuk menyimpan sebarang jenis data dan pengkompil boleh mengetahui jenis data ini pada masa penyusunan. 'objectName' ialah mana-mana nama yang ditentukan pengguna untuk objek. 'new' ialah kata kunci yang digunakan untuk memulakan objek dan 'AnyDisposableType' boleh menjadi mana-mana kelas seperti StreamReader, BinaryReader, SqlConnection, dll. yang objeknya boleh dilupuskan dengan bantuan pernyataan 'menggunakan'.
Untuk aplikasi .NET, kami mempunyai pengumpul sampah untuk membuang memori yang tidak digunakan, tetapi kami masih menghadapi masalah kebocoran memori. Ini tidak bermakna pemungut sampah tidak berfungsi dengan betul, tetapi ini berlaku kerana kejahilan oleh pengaturcara.
Andaikan kita mengabaikan kebocoran memori dalam aplikasi kita untuk tempoh yang sangat lama. Dalam kes itu, kami meningkatkan penggunaan memori aplikasi kami, yang merendahkan prestasi aplikasi kami dan boleh memusnahkannya secara beransur-ansur, memberikan OutOfMemoryException.
Terdapat dua punca utama kebocoran memori dalam C#:
Beberapa sebab menyebabkan kebocoran memori dalam C# adalah seperti berikut:
Contoh yang berbeza dinyatakan di bawah:
Contoh ini menunjukkan utas yang menunggu sendiri untuk ditamatkan dan dengan itu boleh menjadi punca kebocoran ingatan.
Kod:
using System; using System.Threading; namespace ConsoleApp4 { public class Program { public static void Main() { while (true) { Console.WriteLine("Press enter key to start new thread"); Console.ReadLine(); Thread thread = new Thread(new ThreadStart(StartThread)); thread.Start(); } } public static void StartThread() { Console.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " started"); //Wait until current thread terminates Thread.CurrentThread.Join(); } } }
Output:
Setiap kali kita menekan 'Enter' dalam program di atas, penggunaan memorinya meningkat.
Contoh menunjukkan penggunaan sumber yang tidak terurus dengan bantuan pernyataan 'menggunakan' untuk mengelakkan kebocoran ingatan.
Kod:
using System; using System.IO; namespace ConsoleApp4 { public class Program { public static void Main() { string filePath = @"E:\Content\memoryLeak.txt"; string content = string.Empty; try { //writing file using StreamWriter //making use of 'using' statement to dispose object after using it using (StreamWriter writer = new StreamWriter(filePath)) { writer.WriteLine("Learning C# programming"); } //reading file using StreamReader using (StreamReader streamReader = new StreamReader(filePath)) { content = streamReader.ReadToEnd(); } } catch (Exception exception) { Console.WriteLine(exception.Message); Console.ReadLine(); } Console.WriteLine(content); Console.ReadLine(); } } }
Output:
Beberapa perkara yang perlu diingat untuk mengelakkan OutOfMemoryException akibat kebocoran memori dalam C# adalah seperti berikut:
Apabila aplikasi tidak mengeluarkan memori yang telah digunakan semasa pelaksanaannya, memori ini akan disekat dan tidak boleh digunakan oleh mana-mana proses lain, mengakibatkan kebocoran memori. Pengumpul sampah boleh secara automatik membuang objek terurus tetapi tidak boleh membuang objek atau sumber yang tidak diurus.
Atas ialah kandungan terperinci C# Kebocoran Memori. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!