Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 24448|Jawab: 0

[Sumber] . Luapan memori bersih (System.OutOfMemoryException).

[Salin tautan]
Diposting pada 14/03/2019 21.47.39 | | | |
Kapan OutOfMemonryException terjadi? Jika kita mencoba membuat objek baru dan pengumpul sampah tidak dapat menemukan memori kosong, kita dapat menangkap pengecualian; Kasus lain adalah ketika CLR membutuhkan memori dan sistem tidak dapat menyediakannya, pengecualian juga akan dilemparkan. Tetapi pada titik ini, aplikasi kami tidak dapat menangkap kesalahan.

Analisis debug luapan memori (OutOfMemoryException).

Ruang pengalamatan sistem operasi 32-bit adalah 4G, di mana 2G ditempati oleh sistem operasi, yang berarti bahwa memori yang tersisa untuk proses pengguna hanya 2G (yang juga mengurangi sebagian ruang yang ditempati oleh gambar saat program dimuat, umumnya hanya sekitar 1.6G~1.8G yang dapat digunakan). Jika suatu proses perlu meminta memori saat sedang berjalan, dan sistem operasi tidak dapat mengalokasikan ruang memori ke dalamnya, itu akan menghasilkan pengecualian kehabisan memori, System.OutOfMemoryException di .net (Pengecualian yang dilemparkan ketika tidak ada cukup memori untuk melanjutkan eksekusi program.). Meskipun manifestasi akhirnya adalah OutOfMemoryException, penyebabnya mungkin berbeda, dan sebelum memecahkan masalah ini, perlu untuk menganalisis status penggunaan memori saat ini dari proses untuk menemukan penyebab yang benar sebelum meresepkan obat yang tepat. Berikut adalah beberapa tips untuk men-debug masalah tersebut.

Untuk informasi lebih lanjut, silakan lihat:http://blog.csdn.net/lazyleland/article/details/6704661

iis Kesalahan Luapan Memori Kumpulan Aplikasi System.OutOfMemoryException

Pada server web ASP.NET, jumlah memori yang dapat ASP.NET gunakan biasanya tidak sama dengan semua jumlah memori. Dalam file konfigurasi machine.config, <processModel>ada properti "memoryLimit" di bagian konfigurasi, nilai properti ini adalah nilai persentase, defaultnya adalah "60", yaitu proses ASP.NET (Anda dapat melihat proses ASP.NET di pengelola tugas, aspnet_wp di IIS5, w3wp di IIS6) dapat menggunakan 60% dari semua memori fisik. Ketika jumlah memori yang digunakan oleh ASP.NET melebihi batas ini, IIS akan mulai mendaur ulang proses secara otomatis, yaitu, membuat proses baru untuk menangani permintaan Http dan merebut kembali memori yang ditempati oleh proses lama.

Ketika kita memiliki server dengan memori besar, nilai "memoryLimit" perlu disesuaikan dengan tepat. Misalnya, jika kita menyiapkan server dengan chemas-microsoft-com ffice marttags" />t="on"> memori 4G, maka t="on">4G×60%=t="on">2.4G. Namun, untuk sistem operasi Win32, semua ruang memori yang dapat ditempati proses hanya t="on">2G. Ketika memori yang ditempati oleh proses ASP.NET mulai mencapai t="on">2G, karena tidak mencapai "ambang daur ulang" t="on">2.4G, IIS tidak akan memulai operasi proses daur ulang, tetapi karena keterbatasan Win32, sebenarnya tidak mungkin untuk mengalokasikan lebih banyak memori ke proses ini, sehingga OutOfMemoryException kemungkinan besar akan dibuang. Untuk menghindari hal ini, kami harus mengurangi "memoryLimit" dengan tepat sehingga IIS dapat memproses daur ulang lebih awal.

Microsoft merekomendasikan agar proses ASP.NET memakan tidak lebih dari 60% memori, dan yang terbaik adalah membuat nilai aktual yang dihitung tidak lebih dari t="on">800M. Meskipun demikian, untuk server dengan t="on" > memori 4G, yang terbaik adalah mengatur properti "memoryLimit" ke "20". Menetapkan ambang daur ulang yang sesuai untuk IIS untuk mendaur ulang proses secara tepat waktu sangat penting untuk memastikan pengoperasian yang stabil dari seluruh server dan menghindari OutOfMemoryException.

Di IIS6, ambang daur ulang untuk proses ASP.NET tidak lagi ditentukan oleh properti "memoryLimit" di bagian konfigurasi, tetapi oleh pengaturan dalam konfigurasi kumpulan aplikasi di IIS Manager.

Namun, meskipun konfigurasi ini diatur dengan benar, tidak ada jaminan bahwa OutOfMemoryExceptions akan sepenuhnya dihindari, dan alasannya dapat bervariasi dan kompleks, seperti operasi reklamasi memori mungkin terlalu memakan waktu. Pengembang harus selalu ingat untuk tidak menggunakan dan membuang memori yang tidak perlu dalam kode mereka. :)

Jika Anda memiliki server dengan memori besar dan frustrasi dengan batasan penggunaan memori t="on" >2G dalam sistem operasi Win32, ada dua solusi alternatif:

  • Nyalakan komputer dalam mode /3GB, dan ikuti tautan setelah artikel partisipasi metode
  • Gunakan Windows Server 2003 Edisi 64bits


Beberapa elemen untuk menghindari luapan memori

Jika Anda ingin membuat array, pastikan ukurannya benar.

Pastikan Anda memiliki memori yang cukup untuk penggunaan internal dan objek yang dihosting baru.

Jika Anda memprogram di .NET Compact Framework, runtime bahasa publik melemparkan pengecualian ini ketika tidak ada cukup memori untuk penggunaan internal atau objek terkelola baru. Untuk menghindari pengecualian ini, Anda harus menghindari menulis metode besar yang memakan 64 KB atau lebih memori.

Penggunaan memori terkelola yang berlebihan sering disebabkan oleh:

  • Baca himpunan data besar ke dalam memori.
  • Membuat terlalu banyak entri yang di-cache.
  • Unggah atau unduh file besar.
  • Gunakan terlalu banyak ekspresi reguler atau string saat menganalisis file.
  • Status tampilan yang berlebihan.
  • Ada terlalu banyak data atau terlalu banyak sesi dalam status sesi.
  • Pengecualian ini dapat dimunculkan ketika metode dipanggil pada objek COM dan metode mengembalikan jenis yang ditentukan pengguna yang berisi array aman (array dengan ukuran tak terbatas) dengan pesan tambahan "Tidak cukup ruang penyimpanan untuk menyelesaikan operasi ini". Ini karena .NET Framework tidak dapat menyusun bidang struktural dengan jenis array aman.


Contoh pembengkakan memori yang disebabkan oleh penggunaan array byte yang tidak tepat


Jika file output sangat besar, file tersebut dapat langsung melaporkan System.OutOfMemoryException. Cara yang benar untuk melakukannya adalah dengan mengeluarkan aliran byte file dalam segmen, tetapi ada metode siap pakai asp.net Response.WriteFile(filePath) yang melakukan hal itu.

Berikut ini adalah cara menulis yang benar:

Ketika asp.net mengalami luapan memori, cara mudah untuk mengatasinya adalah dengan segera mengklaim kembali kumpulan aplikasi. Tapi ini tidak sepenuhnya menyelesaikan masalah.

Luapan memori saat membuat jenis Gambar (System.OutOfMemoryException)

Kode kesalahan: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. Nama Lengkap);

Pengecualian yang dilemparkan ketika file terbuka bukan file gambar:



MSDN: Metode ini melemparkan pengecualian OutOfMemoryException jika file tidak memiliki format gambar yang valid, atau jika GDI+ tidak mendukung format piksel file.

Informasi abnormal seperti itu mudah menyesatkan.

<processModel> elemen

Konfigurasikan pengaturan model proses ASP.NET pada server web Internet Information Services (IIS). Bagian ini hanya dapat diatur dalam file Machine.config <processModel> , dan itu memengaruhi semua aplikasi ASP.NET yang berjalan di server.

Peringatan Untuk informasi tentang elemen ini, silakan baca bagian "Catatan".

Contoh konfigurasi struktur:

Penafsiran

Sistem konfigurasi kode terkelola tidak membaca <processModel> pengaturan konfigurasi. Sebagai gantinya, itu dibaca langsung oleh DLL yang tidak dikelola aspnet_isapi.dll. Perubahan di bagian ini berlaku setelah Anda memulai ulang IIS.

Jika Anda menginstal ASP.NET pada pengontrol domain, Anda harus mengambil langkah khusus atau penginstalan tidak akan berfungsi. Untuk informasi selengkapnya, lihat Terletak dihttp://support.microsoft.comArtikel Microsoft di Basis Pengetahuan CHS315158 "ASP.NET tidak dapat menggunakan akun ASPNET default pada pengontrol domain".

Saat ASP.NET berjalan dalam mode asli IIS versi 6, ia menggunakan model proses IIS 6 dan mengabaikan <processModel> pengaturan di bagian tersebut. Untuk mengonfigurasi identitas proses, daur ulang, atau nilai model proses lainnya, gunakan antarmuka pengguna Internet Services Manager untuk mengonfigurasi proses pekerja IIS untuk aplikasi Anda.

Nilai waktu diformat sebagai "jam:menit:detik". Jika hanya satu angka yang diberikan tanpa titik dua, nilainya diasumsikan sebagai menit; Oleh karena itu, timeout="4" setara dengan timeout="00:04:00".

Jika aplikasi ASP.NET menyebabkan proses pekerja ASP.NET (Aspnet_wp.exe pada Windows 2000 dan Windows XP Professional dan W3wp.exe di Windows Server 2003) dimulai ulang dan memberikan pesan kesalahan yang menunjukkan bahwa restart disebabkan oleh kondisi kebuntuan yang dicurigai, itu akan meningkat responseDeadlockInterval setelan.

Simpan nama pengguna dan kata sandi di registri

Simpan nama pengguna dan kata sandi di registri

Untuk mengenkripsi nama pengguna dan kata sandi dan menyimpannya di registri, atur userName dan kata sandi sebagai berikut.

userName="registry:HKLM\Software\AspNetProcess,Name"

password="registry:HKLM\Software\AspNetProcess,Pwd"

Bagian string yang muncul setelah registri kata kunci dan sebelum koma menunjukkan nama kunci registri yang ASP.NET terbuka. Bagian setelah koma berisi nama nilai string dari mana ASP.NET akan membaca kredensial. Koma diperlukan dan kredensial harus disimpan di unit konfigurasi HKLM. Jika konfigurasi salah format, ASP.NET tidak akan memulai proses pekerja dan selanjutnya akan muncul di jalur kode kegagalan pembuatan akun saat ini.

Kredensial harus dalam format REG_BINARY dan berisi output panggilan ke fungsi API Windows CryptProtectData. Anda dapat membuat dan menyimpan kredensial enkripsi di registri dengan aplikasi Konsol Registri Pengaturan ASP.NET (Aspnet_setreg.exe), yang menggunakan CryptProtectData untuk menyelesaikan enkripsi. Untuk mengunduh kode sumber Aspnet_setreg.exe dan Visual C++ serta bantuan, kunjungi situs webwww.asp.netdan cari "aspnet_setreg".

Anda harus mengonfigurasi akses ke kunci registri yang menyimpan kredensial terenkripsi sehingga akses hanya tersedia untuk Administrator dan SYSTEM. Karena kunci registri akan dibaca oleh proses ASP.NET yang berjalan sebagai SYSTEM, Anda harus mengatur izin berikut:

Administrators:F

SYSTEM:F

PEMILIK PENCIPTA:F

ProcessAccount:R

Ini akan memberikan dua garis pertahanan untuk melindungi data:

Izin ACL memerlukan akses ke data dengan identitas Administrator.
Penyerang harus menjalankan kode (CryptUnprotectData) di server untuk memulihkan kredensial akun.

contoh

Contoh berikut menentukan beberapa <processModel> pengaturan konfigurasi.

Contoh berikut menentukan bahwa nama pengguna dan kata sandi terenkripsi disimpan di bawah item registri yang ditentukan pengguna AspNetProcess.

Persyaratan

  • Termasuk dalam: <system.web>
  • Platform web: IIS 5.0, IIS 5.1, IIS 6.0
  • File konfigurasi: Machine.config, Web.config
  • Penangan bagian konfigurasi: System.Web.Configuration.ProcessModelConfigurationHandler


http://doc.51windows.net/iismmc/ ... essmodelelement.htm





Mantan:C# menentukan apakah file yang diunggah adalah gambar dan mencegah unggahan Trojan horse
Depan:Berbagi koleksi e-book bahasa C
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com