Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 24448|Atsakyti: 0

[Šaltinis] . Grynosios atminties perpildymas (System.OutOfMemoryException).

[Kopijuoti nuorodą]
Paskelbta 2019-03-14 21:47:39 | | | |
Kada įvyksta OutOfMemonryException? Jei bandysime sukurti naują objektą, o šiukšlių surinkėjas neranda laisvos atminties, galime pagauti išimtį; Kitas atvejis yra tas, kad kai CLR reikia atminties, o sistema negali jos suteikti, išimtis taip pat bus išmesta. Tačiau šiuo metu mūsų programa negali užfiksuoti klaidos.

Atminties perpildymo derinimo analizė (OutOfMemoryException).

32 bitų operacinės sistemos adresavimo vieta yra 4G, iš kurių 2G užima operacinė sistema, o tai reiškia, kad vartotojo procesui likusi atmintis yra tik 2G (kuri taip pat atima dalį vaizdo užimamos vietos, kai programa įkeliama, paprastai galima naudoti tik apie 1.6G ~ 1.8G). Jei procesui reikia prašyti atminties, kol jis veikia, o operacinė sistema negali jam skirti vietos atmintyje, jis sukurs atminties trūkumo išimtį System.OutOfMemoryException .net (Išimtis, kuri pateikiama, kai nepakanka atminties programos vykdymui tęsti). Nors galutinis pasireiškimas yra OutOfMemoryException, priežastis gali būti skirtinga, ir prieš sprendžiant šią problemą, prieš skiriant tinkamą vaistą, būtina išanalizuoti dabartinę proceso atminties naudojimo būseną, kad būtų galima rasti teisingą priežastį. Štai keletas patarimų, kaip derinti tokias problemas.

Daugiau informacijos rasite:http://blog.csdn.net/lazyleland/article/details/6704661

iis programų telkinio atminties perpildymo klaida System.OutOfMemoryException

ASP.NET žiniatinklio serveryje atminties kiekis, kurį ASP.NET gali naudoti, paprastai nėra lygus visam atminties kiekiui. "machine.config" konfigūracijos <processModel>faile konfigūracijos skiltyje yra savybė "memoryLimit", šios savybės vertė yra procentinė vertė, numatytoji yra "60", tai yra, ASP.NET procesas (ASP.NET procesą galite pamatyti užduočių tvarkyklėje, aspnet_wp IIS5, w3wp IIS6) gali naudoti 60% visos fizinės atminties. Kai ASP.NET naudojamos atminties kiekis viršija šią ribą, IIS pradės automatiškai perdirbti procesą, tai yra, sukurs naują procesą, skirtą apdoroti Http užklausas ir susigrąžinti senojo proceso užimtą atmintį.

Kai turime serverį su didele atmintimi, "memoryLimit" reikšmę reikia atitinkamai pakoreguoti. Pavyzdžiui, jei paruošiame serverį su chemas-microsoft-com ffice marttags" />t="on"> 4G atminties, tada t="on">4G×60%=t="on">2.4G. Tačiau Win32 operacinėse sistemose visa atminties vieta, kurią gali užimti procesas, yra tik t="on">2G. Kai ASP.NET proceso užimta atmintis pradeda siekti t="on">2G, nes ji nepasiekia t="on">2.4G "perdirbimo slenksčio", IIS nepradės perdirbimo proceso operacijos, tačiau dėl Win32 apribojimų šiam procesui iš tikrųjų neįmanoma skirti daugiau atminties, todėl tikėtina, kad bus išmesta OutOfMemoryException. Norėdami to išvengti, turėjome atitinkamai sumažinti "memoryLimit", kad IIS galėtų apdoroti perdirbimą anksčiau.

"Microsoft" rekomenduoja, kad ASP.NET procesas užimtų ne daugiau kaip 60% atminties, o apskaičiuotą faktinę vertę geriausia padaryti ne didesnę kaip t="on">800M. Be to, serveriui su t="on" > 4G atmintimi geriausia nustatyti ypatybę "memoryLimit" į "20". Labai svarbu nustatyti tinkamą perdirbimo slenkstį, kad IIS laiku perdirbtų procesus, kad būtų užtikrintas stabilus viso serverio veikimas ir išvengta "OutOfMemoryException".

IIS6 ASP.NET procesų perdirbimo slenkstis nustatomas nebe pagal konfigūracijos sekcijos ypatybę "memoryLimit", o pagal IIS tvarkytuvo programų telkinio konfigūracijos parametrus.

Tačiau net jei šios konfigūracijos nustatytos teisingai, nėra garantijos, kad "OutOfMemoryExceptions" bus visiškai išvengta, o priežastys gali būti įvairios ir sudėtingos, pvz., atminties atkūrimo operacijos gali užtrukti per daug laiko. Kūrėjai visada turėtų nepamiršti, kad savo kode be reikalo nenaudotų ir nešvaistytų atminties. :)

Jei turite serverį su didele atmintimi ir esate nusivylę t="on" >2G atminties naudojimo Win32 operacinėje sistemoje apribojimu, yra du alternatyvūs sprendimai:

  • Paleiskite kompiuterį /3GB režimu ir sekite nuorodą po metodo dalyvavimo straipsnio
  • Naudokite "Windows Server 2003 64bits" leidimą


Keli elementai, kad būtų išvengta atminties perpildymo

Jei norite sukurti masyvą, įsitikinkite, kad jis yra tinkamo dydžio.

Įsitikinkite, kad turite pakankamai atminties vidiniam naudojimui ir naujiems nuomojamiems objektams.

Jei programuojate naudodami .NET Compact Framework, viešosios kalbos vykdymo laikas pateikia šią išimtį, kai nepakanka atminties vidiniam naudojimui arba naujam valdomam objektui. Norėdami išvengti šios išimties, turėtumėte vengti rašyti didelius metodus, kurie užima 64 KB ar daugiau atminties.

Pernelyg didelį valdomos atminties naudojimą dažnai sukelia:

  • Skaitykite didelius duomenų rinkinius į atmintį.
  • Sukurta per daug talpykloje saugomų įrašų.
  • Įkelkite arba atsisiųskite didelius failus.
  • Analizuodami failus naudokite per daug reguliariųjų reiškinių ar eilučių.
  • Pernelyg didelė peržiūros būsena.
  • Seanso būsenoje yra per daug duomenų arba per daug seansų.
  • Ši išimtis gali būti iškelta, kai metodas iškviečiamas COM objekte ir metodas pateikia vartotojo apibrėžtą tipą, kuriame yra saugus masyvas (neapibrėžto dydžio masyvas) su papildomu pranešimu "Nepakanka vietos saugykloje šiai operacijai atlikti". Taip yra todėl, kad .NET Framework negali suskirstyti struktūrinių laukų su saugiais masyvo tipais.


Atminties pertekliaus, atsiradusio dėl netinkamo baitų masyvų naudojimo, pavyzdys


Jei išvesties failas yra ypač didelis, jis gali tiesiogiai pranešti apie System.OutOfMemoryException. Teisingas būdas tai padaryti yra išvesti failo baitų srautą segmentais, tačiau yra asp.net paruoštas metodas Response.WriteFile(filePath), kuris tai daro.

Toliau pateikiamas teisingas rašymo būdas:

Kai asp.net patiria atminties perpildymą, paprastas būdas su tuo susidoroti yra nedelsiant susigrąžinti programų telkinį. Bet tai visiškai neišsprendė problemos.

Atminties perpildymas kuriant vaizdo tipą (System.OutOfMemoryException)

Klaidos kodas: System.Drawing.Image myimg=System.Drawing.Image.FromFile(failas. Vardas ir pavardė);

Išimtys, kurios pateikiamos, kai atidarytas failas nėra vaizdo failas:



MSDN: Šis metodas pateikia OutOfMemoryException išimtį, jei failas neturi tinkamo vaizdo formato arba jei GDI+ nepalaiko failo pikselių formato.

Tokia neįprasta informacija lengvai klaidina.

<processModel> elementas

Konfigūruokite ASP.NET proceso modelio parametrus interneto informacinių paslaugų (IIS) žiniatinklio serveryje. Sekciją galima nustatyti tik faile Machine.config <processModel> ir ji turi įtakos visoms serveryje veikiančioms ASP.NET programoms.

Įspėjimas Norėdami gauti informacijos apie šį elementą, skaitykite skyrių "Pastabos".

Struktūros konfigūravimo pavyzdys:

Egzegezė

Valdomo kodo konfigūravimo sistema neskaito <processModel> konfigūracijos parametrų. Vietoj to, jį tiesiogiai skaito nevaldomas DLL aspnet_isapi.dll. Šio skyriaus pakeitimai įsigalioja iš naujo paleidus IIS.

Jei įdiegiate ASP.NET domeno valdiklyje, turite imtis specialių veiksmų, kitaip diegimas neveiks. Daugiau informacijos rasitehttp://support.microsoft.com"Microsoft" žinių bazės straipsnyje CHS315158 "ASP.NET negalite naudoti numatytosios ASPNET paskyros domeno valdikliuose".

Kai ASP.NET veikia IIS 6 versijos vietiniu režimu, jis naudoja IIS 6 proceso modelį ir <processModel> nepaiso skyriaus parametrų. Norėdami konfigūruoti proceso tapatybę, perdirbimą ar kitas proceso modelio reikšmes, naudokite interneto paslaugų tvarkytuvo vartotojo sąsają, kad sukonfigūruotumėte IIS darbo procesus savo programai.

Laiko reikšmė formatuojama kaip "valandos:minutės:sekundės". Jei be dvitaškio pateikiamas tik vienas skaičius, laikoma, kad vertė yra minutės; Todėl timeout="4" atitinka timeout="00:04:00".

Jei ASP.NET taikomoji programa iš naujo paleidžia ASP.NET darbo procesus (Aspnet_wp.exe Windows 2000 ir Windows XP Professional ir W3wp.exe Windows Server 2003) ir pateikia klaidos pranešimą, nurodantį, kad paleidimas iš naujo įvyko dėl įtariamo aklavietės, jis turėtų padidėti responseDeadlockInterval nustatymas.

Saugokite vartotojo vardus ir slaptažodžius registre

Saugokite vartotojo vardus ir slaptažodžius registre

Norėdami užšifruoti vartotojo vardus ir slaptažodžius ir saugoti juos registre, nustatykite vartotojo vardą ir slaptažodį taip.

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

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

Eilutės dalis, esanti po raktinių žodžių registro ir prieš kablelį, nurodo registro rakto, kurį ASP.NET atidaroma, pavadinimą. Dalyje po kablelio yra eilutės reikšmės pavadinimas, iš kurio ASP.NET nuskaitys kredencialus. Kableliai yra būtini, o kredencialai turi būti saugomi HKLM konfigūracijos bloke. Jei konfigūracija neteisingai suformatuota, ASP.NET nepradės darbo proceso ir vėliau bus rodomas dabartinio abonemento kūrimo gedimo kodo kelyje.

Kredencialai turi būti REG_BINARY formato ir juose turi būti "Windows" API funkcijos "CryptProtectData" iškvietimo išvestis. Šifravimo kredencialus registre galite sukurti ir saugoti naudodami "ASP.NET Settings" registro konsolės programą (Aspnet_setreg.exe), kuri šifravimui užbaigti naudoja "CryptProtectData". Norėdami atsisiųsti Aspnet_setreg.exe ir "Visual C++" šaltinio kodą bei pagalbą, apsilankykite svetainėjewww.asp.netir ieškokite "aspnet_setreg".

Turėtumėte sukonfigūruoti prieigą prie registro raktų, kuriuose saugomi užšifruoti kredencialai, kad prieiga būtų prieinama tik administratoriams ir SYSTEM. Kadangi registro raktą nuskaitys ASP.NET procesas, veikiantis kaip SYSTEM, turėtumėte nustatyti šias teises:

Administrators:F

SYSTEM:F

KŪRĖJAS SAVININKAS:F

ProcessAccount:R

Tai suteiks dvi gynybos linijas duomenims apsaugoti:

ACL teisėms reikalinga prieiga prie duomenų su administratoriaus tapatybe.
Užpuolikas turėtų paleisti kodą (CryptUnprotectData) serveryje, kad atkurtų paskyros kredencialus.

pavyzdys

Toliau pateiktame pavyzdyje nurodyti keli <processModel> konfigūracijos parametrai.

Toliau pateiktame pavyzdyje nurodoma, kad užšifruotas vartotojo vardas ir slaptažodis saugomi registro vartotojo apibrėžtame elemente AspNetProcess.

Reikalavimai

  • Įtraukta: <system.web>
  • Žiniatinklio platforma: IIS 5.0, IIS 5.1, IIS 6.0
  • Konfigūracijos failai: Machine.config, Web.config
  • Konfigūracijos sekcijos apdorojimo programa: System.Web.Configuration.ProcessModelConfigurationHandler


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





Ankstesnis:C# nustato, ar įkeltas failas yra vaizdas, ir neleidžia įkelti Trojos arklio
Kitą:C kalbos el. knygų kolekcijos dalijimasis
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com