Rumah  >  Artikel  >  pembangunan bahagian belakang  >  C# OutOfMemoryException

C# OutOfMemoryException

王林
王林asal
2024-09-03 15:21:13768semak imbas

OutOfMemoryException dalam C# ialah pengecualian yang dilemparkan oleh enjin pelaksanaan rangka kerja .NET apabila atur cara tidak mempunyai memori yang mencukupi untuk meneruskan pelaksanaannya. Seperti namanya, pengecualian ini akan berlaku dalam program kami apabila CLR iaitu Common Language Runtime tidak akan dapat memperuntukkan memori yang mencukupi yang diperlukan untuk melaksanakan operasi tertentu program kami.

Pengecualian ini tidak selalu bermakna bahawa kita tidak mempunyai ruang yang mencukupi dalam ingatan tetapi kadangkala ia bermakna kita tidak mempunyai ingatan bersebelahan yang mencukupi yang diperlukan oleh program kita untuk peruntukan.

Sintaks

Sintaks untuk menangkap OutOfMemoryException dalam C# adalah seperti berikut:

try
{
//user code which can throw OutOfMemoryException
}
catch(OutOfMemoryException <em>exception</em>)
{
//statements to handle the exception
}

Sintaks untuk membuang OutOfMemoryException dalam C# adalah seperti berikut:

throw new OutOfMemoryException();

Dalam pernyataan di atas 'buang' ialah kata kunci yang digunakan untuk membuang pengecualian dalam C#.

Bagaimana OutOfMemoryException berfungsi dalam C#?

Dalam C#, kami mendapat OutOfMemoryException apabila program kami tidak mempunyai ruang yang mencukupi untuk meneruskan pelaksanaannya. Mungkin terdapat banyak sebab untuk mendapatkan pengecualian ini. Kami juga menghadapi pengecualian ini apabila secara keseluruhan kami mempunyai ruang yang cukup untuk program kami untuk dilaksanakan tetapi ruang ini tidak bersebelahan untuk peruntukan yang diperlukan untuk dilakukan oleh program kami. Dua sebab utama pengecualian ini adalah seperti berikut:

Cuba untuk menambah panjang objek StringBuilder melebihi panjang yang ditentukan oleh sifat MaxCapacity StringBuilder.

Kami akan mendapat pengecualian yang mengatakan "Memori tidak mencukupi untuk meneruskan pelaksanaan program."

  • Apabila kita membuat tugasan atau memanggil kaedah yang memerlukan peruntukan memori dan pada masa yang sama CLR tidak dapat menyediakan memori bersebelahan yang mencukupi untuk peruntukan kita maka kita akan mendapat OutOfMemoryException.

Sebab lain yang boleh menjadi punca pengecualian ini termasuk:

  • Menjalankan aplikasi pada sistem 32-bit yang mempunyai hanya 2GB memori maya kerana CLR mendapati sukar untuk menyediakan memori bersebelahan untuk peruntukan yang diperlukan oleh aplikasi.
  • Selepas bekerja dengan sumber yang tidak terurus seperti pengendali fail, sambungan pangkalan data, penunjuk, dsb. jika kita tidak melupuskan sumber ini maka ia membawa kepada kebocoran memori yang mengakibatkan merendahkan prestasi aplikasi kita dan boleh membawa kepada OutOfMemoryException.
  • Bekerja dengan set data yang besar memerlukan jumlah memori yang besar dan jika CLR tidak mempunyai ruang bersebelahan yang mencukupi untuknya maka ia menghasilkan OutOfMemoryException.
  • Memandangkan rentetan tidak boleh diubah, operasi yang dilakukan pada rentetan mencipta rentetan baharu dalam ingatan. Jadi, jika kita bekerja dengan rentetan besar dan jika kita melakukan operasi penggabungan berulang kali pada rentetan maka ia boleh membawa kepada beberapa peruntukan memori yang hasilnya akan merendahkan prestasi aplikasi kita dan boleh menjadi punca OutOfMemoryException.
  • Jika kita telah menyematkan berbilang objek dalam ingatan untuk tempoh yang sangat lama maka ia menjadi sukar bagi pemungut sampah untuk menyediakan peruntukan memori bersebelahan kepada objek ini.

Contoh

Berikut ialah contoh berikut yang disebut di bawah

Contoh #1

Contoh yang menunjukkan OutOfMemoryException yang dilemparkan oleh program apabila kami cuba mengembangkan objek StringBuilder melebihi kapasiti maksimumnya.

Kod:

using System;
using System.Text;
public class Program
{
public static void Main()
{
StringBuilder stringBuilder = new StringBuilder(17, 17);
stringBuilder.Append("Welcome to the ");
try
{
stringBuilder.Insert(0, "world of C# programming", 1);
Console.WriteLine(stringBuilder.ToString());
Console.ReadLine();
}
catch (OutOfMemoryException exception)
{
Console.WriteLine(exception.Message);
Console.ReadLine();
}
}
}

Output:

C# OutOfMemoryException

Contoh #2

Contoh menunjukkan atur cara yang menemui OutOfMemoryException semasa cuba menambah elemen dalam senarai dengan bilangan elemen yang akan ditambah adalah lebih daripada kapasiti senarai.

Kod:

using System;
using System.Text;
using System.Collections.Generic;
namespace ConsoleApp4
{
public class Program
{
public static void Main()
{
try
{
string[] strArray = GetArray();
Console.WriteLine(strArray);
Console.ReadLine();
}
catch (OutOfMemoryException exception)
{
Console.WriteLine(exception);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
public static string[] GetArray()
{
List<string> strList = new List<string>();
for (int i = 0; i <= int.MaxValue; i++)
{
strList.Add("Hello");
}
return strList.ToArray();
}
}
}

Output:

C# OutOfMemoryException

Bagaimana untuk mengelakkan OutOfMemoryException dalam C#?

Kita boleh mengelakkan OutOfMemoryException dalam C# dengan mengingati perkara berikut:

  • Untuk mengelakkan pengecualian ini semasa bekerja dengan StringBuilder, kami boleh memanggil pembina StringBuilder.StringBuilder(Int32, Int32) dan boleh menetapkan sifat MaxCapacity kepada nilai yang cukup besar untuk menyediakan penginapan yang diperlukan apabila kami mengembangkan StringBuilder yang sepadan objek.
  • Untuk mengelakkan pengecualian ini semasa bekerja pada sistem 32-bit, kami boleh menyusun semula aplikasi kami daripada sistem 32 bit kepada 64-bit dalam studio visual dengan langkah-langkah di bawah:
  1. Bar Menu -> Bina -> Pengurus Konfigurasi
  2. Klik pada senarai Platform Penyelesaian Aktif dan pilih platform 64-bit dan kemudian klik pada butang Tutup.
  3. Jika platform 64-bit tidak tersedia dalam senarai maka:

    • Klik pada pilihan Baharu daripada senarai
    • Pada Tetingkap Platform Penyelesaian Baharu, klik pada senarai ‘Taip atau pilih platform baharu’ dan kemudian pilih pilihan ‘x64’.
    • Klik pada butang OK.
    • Untuk mengelak daripada mendapat pengecualian ini semasa bekerja dengan sumber yang tidak terurus, kami harus sentiasa memanggil kaedah Dispose() selepas menyelesaikan kerja kami dengan sumber yang tidak terurus yang tidak diperlukan lagi.
    • Untuk mengelakkan pengecualian ini semasa bekerja dengan set data yang besar, kami harus cuba menapis data dan kemudian hanya perlu menghantar data yang diperlukan untuk pemprosesan.
    • Untuk mengelakkan pengecualian ini semasa bekerja dengan rentetan besar atau semasa melakukan penggabungan rentetan besar, kita boleh menggunakan StringBuilder dan bukannya rentetan kerana StringBuilder boleh berubah dan tidak mencipta tika baharu rentetan apabila kita melakukan sebarang operasi padanya.

    Kesimpulan

    OutOfMemoryException ialah pengecualian masa jalan yang memberitahu pengaturcara bahawa tidak ada memori yang mencukupi atau kekurangan memori bersebelahan untuk peruntukan yang diperlukan oleh program C#.

    Untuk mengelakkan pengecualian ini, pengguna harus sentiasa mengambil langkah berjaga-jaga yang diperlukan dan harus mengendalikan pengecualian ini.

    Atas ialah kandungan terperinci C# OutOfMemoryException. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:C# NullReferenceExceptionArtikel seterusnya:C# NullReferenceException