Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 24448|Răspunde: 0

[Sursă] . Debordare de memorie netă (System.OutOfMemoryException).

[Copiază linkul]
Postat pe 14.03.2019 21:47:39 | | | |
Când are loc o OutOfMemonryException? Dacă încercăm să creăm un obiect nou și colectorul de gunoi nu găsește nicio memorie liberă, putem prinde excepția; Un alt caz este că, atunci când CLR are nevoie de memorie și sistemul nu o poate furniza, excepția va fi de asemenea aruncată. Dar în acest moment, aplicația noastră nu poate detecta eroarea.

Analiza de depanare a depășirii memoriei (OutOfMemoryException).

Spațiul de adresare al sistemului de operare pe 32 de biți este 4G, din care 2G este ocupat de sistemul de operare, ceea ce înseamnă că memoria lăsată pentru procesul utilizatorului este doar 2G (ceea ce scade și o parte din spațiul ocupat de imagine la încărcarea programului, în general doar aproximativ 1,6G~1,8G pot fi folosite). Dacă un proces are nevoie să solicite memorie în timp ce rulează și sistemul de operare nu poate aloca spațiu de memorie, va produce o excepție de ieșire din memorie, System.OutOfMemoryException în .net (excepția care este aruncată atunci când nu există suficientă memorie pentru a continua execuția unui program). Deși manifestarea finală este OutOfMemoryException, cauza poate fi diferită, iar înainte de a rezolva această problemă, este necesar să analizăm starea actuală a utilizării memoriei a procesului pentru a găsi cauza corectă înainte de a prescrie medicamentul potrivit. Iată câteva sfaturi pentru depanarea unor astfel de probleme.

Pentru mai multe informații, vă rugăm să consultați:http://blog.csdn.net/lazyleland/article/details/6704661

iis Application Pool Memory Overflow Error System.OutOfMemoryException

Pe un server web ASP.NET, cantitatea de memorie pe care ASP.NET o poate folosi nu este de obicei egală cu toată cantitatea de memorie. În fișierul de configurare machine.config, <processModel>există proprietatea "memoryLimit" în secțiunea de configurare, valoarea acestei proprietăți este procentuală, implicit este "60", adică procesul ASP.NET (poți vedea procesul ASP.NET în managerul de sarcini, aspnet_wp în IIS5, w3wp în IIS6) poate folosi 60% din toată memoria fizică. Când cantitatea de memorie folosită de ASP.NET depășește această limită, IIS începe să recicleze automat procesul, adică să creeze un proces nou pentru a gestiona cererile Http și să recupereze memoria ocupată de vechiul proces.

Când avem un server cu o memorie mare, valoarea "memoryLimit" trebuie ajustată corespunzător. De exemplu, dacă pregătim un server cu chemas-microsoft-com ffice marttags" />t="on"> memorie 4G, atunci t="on">4G×60%=t="on">2.4G. Totuși, pentru sistemele de operare Win32, tot spațiul de memorie pe care îl poate ocupa un proces este doar t="on">2G. Când memoria ocupată de procesul ASP.NET începe să ajungă la t="on">2G, deoarece nu atinge "pragul de reciclare" al t="on">2.4G, IIS nu va începe operația de reciclare, dar din cauza limitărilor Win32, este de fapt imposibil să aloce mai multă memorie acestui proces, așa că OutOfMemoryException este probabil să fie aruncată. Pentru a evita acest lucru, a trebuit să reducem "memoryLimit" corespunzător, astfel încât IIS să poată procesa reciclarea mai devreme.

Microsoft recomandă ca ASP.NET proces să nu ocupe mai mult de 60% din memorie și este cel mai bine ca valoarea reală calculată să nu depășească t="în">800M. Totuși, pentru un server cu t="on" > memorie 4G, cel mai bine este să setezi proprietatea "memoryLimit" la "20". Stabilirea unui prag adecvat de reciclare pentru ca IIS să recicleze procesele în timp util este foarte importantă pentru a asigura funcționarea stabilă a întregului server și a evita OutOfMemoryException.

În IIS6, pragul de reciclare pentru procesele ASP.NET nu mai este determinat de proprietatea "memoryLimit" din secțiunea de configurare, ci de setările din configurația pool-ului de aplicații din IIS Manager.

Totuși, chiar dacă aceste configurații sunt setate corect, nu există nicio garanție că OutOfMemoryExceptions vor fi complet evitate, iar motivele pot fi variate și complexe, cum ar fi operațiunile de recuperare a memoriei care pot fi prea consumatoare de timp. Dezvoltatorii ar trebui să țină mereu minte să nu folosească și să irosească memorie inutil în codul lor. :)

Dacă ai un server cu o memorie mare și ești frustrat de limita folosirii memoriei t="on" >2G în sistemul de operare Win32, există două soluții alternative:

  • Pornește calculatorul în modul /3GB și urmează linkul de după articolul despre participarea la metode
  • Folosește Windows Server 2003 64bit Edition


Mai multe elemente pentru a evita depășirea memoriei

Dacă vrei să creezi un array, asigură-te că are dimensiunea corectă.

Asigură-te că ai suficientă memorie pentru uz intern și pentru noi obiecte găzduite.

Dacă programezi pe .NET Compact Framework, runtime-ul limbajului public aruncă această excepție atunci când nu există suficientă memorie pentru uz intern sau pentru un nou obiect gestionat. Pentru a evita această excepție, ar trebui să eviți să scrii metode mari care ocupă 64KB sau mai mult de memorie.

Utilizarea excesivă a memoriei gestionate este adesea cauzată de:

  • Citește seturi mari de date în memorie.
  • Creezi prea multe intrări în cache.
  • Încarcă sau descarcă fișiere mari.
  • Folosește prea multe expresii regulate sau șiruri când analizezi fișiere.
  • Statut de vizualizare excesivă.
  • Există prea multe date sau prea multe sesiuni în starea de sesiune.
  • Această excepție poate fi ridicată atunci când o metodă este apelată pe un obiect COM, iar metoda returnează un tip definit de utilizator care conține un tablou securizat (un tablou de dimensiuni nedefinite) cu un mesaj suplimentar "Nu este suficient spațiu de stocare pentru a finaliza această operație". Acest lucru se datorează faptului că .NET Framework nu poate mobiliza câmpuri structurale cu tipuri de array-uri sigure.


Un exemplu de suprasolicitare a memoriei cauzată de utilizarea necorespunzătoare a tablourilor de octeți


Dacă fișierul de ieșire este deosebit de mare, poate raporta direct System.OutOfMemoryException. Modul corect de a face asta este să se genereze fluxul de octeți al fișierului în segmente, dar există asp.net metodă gata făcută, Response.WriteFile(filePath), care face exact asta.

Următoarea este metoda corectă de a scrie:

Când un asp.net experimentează o revărsare de memorie, o modalitate simplă de a o gestiona este să recuperezi imediat pool-ul de aplicații. Dar acest lucru nu a rezolvat complet problema.

Debordare de memorie la crearea unui tip de imagine (System.OutOfMemoryException)

Cod de eroare: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. Nume complet);

Excepții care sunt aruncate atunci când un fișier deschis nu este un fișier de imagine:



MSDN: Această metodă generează o excepție OutOfMemoryException dacă fișierul nu are un format de imagine valid sau dacă GDI+ nu suportă formatul de pixeli al fișierului.

Astfel de informații anormale pot induce ușor în eroare.

<processModel> element

Configurați setările modelului de proces ASP.NET pe serverul web Internet Information Services (IIS). Secțiunea poate fi setată doar în fișierul <processModel> Machine.config și afectează toate aplicațiile ASP.NET care rulează pe server.

Atenție: Pentru informații despre acest element, vă rugăm să citiți secțiunea "Note".

Exemplu de configurare a structurii:

Exegeză

Sistemul de configurare a codului gestionat nu citește <processModel> setările de configurare. În schimb, este citită direct de DLL-ul negestionat aspnet_isapi.dll. Schimbările din această secțiune intră în vigoare după ce repornești IIS.

Dacă instalezi ASP.NET pe un controller de domeniu, trebuie să faci pași speciali, altfel instalarea nu va funcționa. Pentru mai multe informații, vezi Situat înhttp://support.microsoft.comArticolul Microsoft din Knowledge Base CHS315158 "Nu ASP.NET poți folosi contul ASPNET implicit pe controlerele de domeniu".

Când ASP.NET rulează în modul nativ IIS versiunea 6, folosește modelul de proces IIS 6 și ignoră <processModel> setările din secțiune. Pentru a configura identitatea procesului, reciclarea sau alte valori ale modelului de proces, folosiți interfața de utilizator Internet Services Manager pentru a configura procesele worker IIS pentru aplicația dumneavoastră.

Valoarea timpului este formatată ca "ore:minute:secunde". Dacă este dat doar un singur număr fără două puncte, valoarea este considerată a fi minute; Prin urmare, timeout="4" este echivalent cu timeout="00:04:00".

Dacă o aplicație ASP.NET face ca procesele ASP.NET worker (Aspnet_wp.exe pe Windows 2000 și Windows XP Professional și W3wp.exe pe Windows Server 2003) să se repornească și afișează un mesaj de eroare care indică faptul că repornirea se datorează unei suspiciuni de blocaj, ar trebui să crească responseDeadlockInterval setting.

Stochează numele de utilizator și parolele în registru

Stochează numele de utilizator și parolele în registru

Pentru a cripta numele de utilizator și parolele și a le stoca în registru, setați numele de utilizator și parola după cum urmează.

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

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

Partea șirului care vine după registrul de cuvinte-cheie și înainte de virgulă indică numele cheii de registru pe care ASP.NET deschise. Partea de după virgulă conține un nume de valoare de șir de la care ASP.NET va citi acreditările. Sunt necesare virgule, iar acreditările trebuie stocate în unitatea de configurare HKLM. Dacă configurația este formatată greșit, ASP.NET nu va porni procesul de lucru și va apărea ulterior pe calea codului curent de eșec de creare a contului.

Acreditările trebuie să fie în format REG_BINARY și să conțină ieșirea unui apel către funcția API Windows CryptProtectData. Poți crea și stoca acreditări de criptare în registru cu aplicația ASP.NET Settings Registry Console (Aspnet_setreg.exe), care folosește CryptProtectData pentru a finaliza criptarea. Pentru a descărca codul sursă Aspnet_setreg.exe și Visual C++ și pentru ajutor, vizitați site-ul webwww.asp.netși caută "aspnet_setreg".

Ar trebui să configurați accesul la cheile de registru care stochează datele criptate astfel încât accesul să fie disponibil doar pentru administratori și SISTEM. Deoarece cheia registrului va fi citită de ASP.NET proces care rulează ca SYSTEM, ar trebui să setați următoarele permisiuni:

Administrators:F

SYSTEM:F

CREATOR PROPRIETAR: F

ProcessAccount:R

Aceasta va oferi două linii de apărare pentru protejarea datelor:

Permisiunile ACL necesită acces la date cu identitatea Administratorului.
Atacatorul ar trebui să ruleze cod (CryptUnprotectData) pe server pentru a recupera acreditările contului.

exemplu

Exemplul următor specifică mai multe <processModel> setări de configurare.

Exemplul următor specifică faptul că numele de utilizator criptat și parola sunt stocate sub elementul definit de utilizator al registrului AspNetProcess.

Cerințe

  • Inclus în: <system.web>
  • Platformă web: IIS 5.0, IIS 5.1, IIS 6.0
  • Fișiere de configurare: Machine.config, Web.config
  • Handler secțiune de configurare: System.Web.Configuration.ProcessModelConfigurationHandler


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





Precedent:C# determină dacă fișierul încărcat este o imagine și previne încărcarea calului troian
Următor:Partajarea colecțiilor de cărți electronice în limba C
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com