See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 24448|Vastuse: 0

[Allikas] . Netomälu ületäitumine (System.OutOfMemoryException).

[Kopeeri link]
Postitatud 14.03.2019 21:47:39 | | | |
Millal tekib OutOfMemonryException? Kui proovime luua uut objekti ja prügikoguja ei leia vaba mälu, saame erandi kinni püüda; Teine juhtum on see, et kui CLR vajab mälu ja süsteem ei saa seda pakkuda, siis erand lisatakse samuti. Kuid praegu ei suuda meie rakendus viga tuvastada.

Mälu ületäitmise silumisanalüüs (OutOfMemoryException).

32-bitise operatsioonisüsteemi aadressiruum on 4G, millest 2G on operatsioonisüsteemi poolt hõivatud, mis tähendab, et kasutajaprotsessile jääb alles vaid 2G mälu (mis vähendab ka osa pildi ruumist programmi laadimisel, tavaliselt saab kasutada vaid umbes 1,6G~1,8G). Kui protsess peab töötamise ajal mälu taotlema ja operatsioonisüsteem ei saa talle mäluruumi eraldada, tekitab ta mäluvälise erandi, System.OutOfMemoryException in .net (erand, mis visatakse siis, kui programmi täitmiseks pole piisavalt mälu). Kuigi lõplik avaldumine on OutOfMemoryException, võib põhjus olla erinev ning enne selle probleemi lahendamist on vajalik analüüsida protsessi praegust mälukasutuse seisundit, et leida õige põhjus enne õige ravimi määramist. Siin on mõned nõuanded selliste probleemide silumiseks.

Lisainfo saamiseks palun vaata:http://blog.csdn.net/lazyleland/article/details/6704661

iis rakenduste basseini mäluületäitmise veasüsteem.OutOfMemoryException

ASP.NET veebiserveris ei ole ASP.NET kasutatava mälu hulk tavaliselt võrdne kogu mäluga. machine.config konfiguratsioonifailis <processModel>on konfiguratsioonisektsioonis omadus "memoryLimit", selle omaduse väärtus on protsentväärtus, vaikimisi "60", st ASP.NET protsess (ASP.NET protsessi näed tegumihalduris, aspnet_wp IIS5-s, w3wp IIS6-s) võib kasutada 60% kogu füüsilisest mälust. Kui ASP.NET kasutatav mälumaht ületab selle piiri, hakkab IIS protsessi automaatselt taaskasutama, st luues uue protsessi Http-päringute haldamiseks ja võttes tagasi vana protsessi mälu.

Kui serveril on suur mälu, tuleb "memoryLimit" väärtust vastavalt kohandada. Näiteks, kui valmistame serveri ette chemas-microsoft-com ffice marttags" />t="on"> 4G mäluga, siis t="on">4G×60%=t="on">2.4G. Kuid Win32 operatsioonisüsteemide puhul on kogu protsess hõivatud mäluruum ainult t="on">2G. Kui ASP.NET protsessi mälu hakkab jõudma t="on">2G-ni, kuna see ei saavuta "taaskasutusläve" t="on">2.4G, siis IIS ei alusta taaskasutusprotsessi operatsiooni, kuid Win32 piirangute tõttu on tegelikult võimatu sellele protsessile rohkem mälu eraldada, seega visatakse tõenäoliselt OutOfMemoryException. Selle vältimiseks pidime "memoryLimiti" vastavalt vähendama, et IIS saaks taaskasutust varem töödelda.

Microsoft soovitab, et ASP.NET protsess võtaks maksimaalselt 60% mälust ning arvutatud tegelik väärtus oleks kõige parem teha kui t="on">800M. Samas, serveri puhul, millel on t="sees" > 4G mälu, on kõige parem määrata "memoryLimit" omadus "20". Sobiva taaskasutusläve seadmine IIS-ile protsesside õigeaegseks taaskasutamiseks on väga oluline, et tagada kogu serveri stabiilne toimimine ja vältida OutOfMemoryException'i.

IIS6-s ei määra ASP.NET protsesside taaskasutuslävi enam konfiguratsioonisektsioonis olev "memoryLimit" omadus, vaid rakenduste kogumi seadistuste järgi IIS Manageris.

Kuid isegi kui need konfiguratsioonid on õigesti seatud, ei ole garantiid, et OutOfMemoryExceptions täielikult välditakse, ning põhjused võivad olla mitmekesised ja keerulised, näiteks mälu taaskasutuse operatsioonid võivad olla liiga ajamahukad. Arendajad peaksid alati meeles pidama, et nad ei kasuta ega raiskaks mälu oma koodis tarbetult. :)

Kui sul on server, millel on suur mälu ja sind häirib Win32 operatsioonisüsteemis t="sees" >2G mälu kasutamise piirang, on kaks alternatiivset lahendust:

  • Käivita arvuti /3GB režiimis ja järgi meetodite osalemise artikli järel olevat linki
  • Kasuta Windows Server 2003 64bits Editioni


Mõned elemendid mälu üleujutuse vältimiseks

Kui tahad massiivi luua, veendu, et see oleks õige suurusega.

Veendu, et sul oleks piisavalt mälu sisemiseks kasutamiseks ja uute hostitud objektide jaoks.

Kui programmeerid .NET Compact Frameworkil, siis avaliku keele käitusaeg annab selle erandi, kui sisemiseks kasutamiseks või uue hallatava objekti jaoks pole piisavalt mälu. Selle erandi vältimiseks tuleks vältida suurte meetodite kirjutamist, mis võtavad 64KB või rohkem mälu.

Liigne hallatud mälu kasutus on sageli põhjustatud järgmistest:

  • Loe suuri andmekogumeid mällu.
  • Liiga palju vahemällu salvestatud kirjeid.
  • Laadi üles või laadi alla suuri faile.
  • Kasuta failide analüüsimisel liiga palju regulaarseid avaldisi või stringe.
  • Liigne vaatamise staatus.
  • Sessiooniolekus on liiga palju andmeid või liiga palju sessioone.
  • See erand võib tekkida siis, kui COM-objektil kutsutakse meetod ja meetod tagastab kasutaja määratud tüübi, mis sisaldab turvalist massiivi (määramata suurusega massiivi) koos lisateatega "Ei ole piisavalt salvestusruumi selle toimingu lõpetamiseks". See on tingitud sellest, et .NET raamistik ei saa strukturaalvälju korraldada turvaliste massiivitüüpidega.


Näide mälu ülekoormusest, mis on põhjustatud baitmassiivide ebaõigest kasutamisest


Kui väljundfail on eriti suur, võib see otse raporteerida System.OutOfMemoryException. Õige viis selleks on väljundida faili baitvoog segmentidena, kuid on olemas valmis meetod Response.WriteFile(filePath), mis asp.net just seda teeb.

Järgmine on õige viis kirjutamiseks:

Kui asp.net kogeb mälu üleujutust, on lihtne viis sellega toime tulla rakenduste bassein kohe tagasi võtta. Kuid see ei lahendanud probleemi täielikult.

Mälu ületäitumine pilditüübi loomisel (System.OutOfMemoryException)

Veakood: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. Täisnimi);

Erandid, mis tekivad, kui avatud fail ei ole pildifail:



MSDN: See meetod annab OutOfMemoryException erandi, kui failil puudub kehtiv pildiformaat või kui GDI+ ei toeta faili piksliformaati.

Selline ebanormaalne info on kergesti eksitav.

<processModel> Element

Seadista ASP.NET protsessimudeli seaded Internet Information Services (IIS) veebiserveris. Seda sektsiooni saab määrata ainult Machine.config <processModel> failis ning see mõjutab kõiki serveris töötavaid ASP.NET rakendusi.

Hoiatus Selle elemendi kohta lisateabe saamiseks palun lugege "Märkused" jaotist.

Näide struktuuri seadistamisest:

Eksegees

Hallatud koodi konfiguratsioonisüsteem ei loe <processModel> seadistusseadeid. Selle asemel loeb seda otse haldamata DLL aspnet_isapi.dll. Selle osa muudatused jõustuvad pärast IIS-i taaskäivitamist.

Kui paigaldad ASP.NET domeenikontrollerile, pead tegema erimeetmeid, muidu paigaldus ei tööta. Lisateabe saamiseks vaata Asukohthttp://support.microsoft.comMicrosofti artikkel Knowledge Base'is CHS315158 "ASP.NET ei saa kasutada vaikimisi ASPNET kontot domeenikontrolleritel".

Kui ASP.NET töötab IIS versiooni 6 natiivses režiimis, kasutab see IIS 6 protsessimudelit ja <processModel> ignoreerib sektsioonis olevaid seadeid. Protsessi identiteedi, taaskasutuse või muude protsessimudeli väärtuste seadistamiseks kasuta Internet Services Manageri kasutajaliidest, et seadistada IIS-i töötajaprotsesse oma rakendusele.

Ajaväärtus on vormindatud kui "tunnid:minutid:sekundid". Kui on antud ainult üks arv ilma koolonita, eeldatakse väärtust minutiteks; Seega on timeout="4" samaväärne timeout="00:04:00"-ga.

Kui ASP.NET rakendus põhjustab ASP.NET töötajate protsesside taaskäivituse (Aspnet_wp.exe Windows 2000 ja Windows XP Professional ning W3wp.exe Windows Server 2003 puhul) ning annab veateate, mis viitab sellele, et taaskäivitus on tingitud kahtlustatavast ummikseisust, peaks see suurenema responseDeadlockInterval seadistus.

Salvesta kasutajanimed ja paroolid registrisse

Salvesta kasutajanimed ja paroolid registrisse

Kasutajanimede ja paroolide krüpteerimiseks ning registrisse salvestamiseks määra kasutajanimi ja parool järgmiselt.

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

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

Stringi osa, mis tuleb pärast märksõnaregistrit ja enne koma, näitab registrivõtme nime, mis ASP.NET avaneb. Koma järel olev osa sisaldab stringiväärtuse nime, millest ASP.NET loeb volitused. Vajalikud komad on kohustuslikud ja volitused peavad olema salvestatud HKLM konfiguratsiooniüksuses. Kui konfiguratsioon on valesti vormindatud, ei käivita ASP.NET tööprotsessi ja ilmub seejärel praeguse konto loomise rikete koodi teele.

Mandaadid peavad olema REG_BINARY formaadis ja sisaldama Windowsi API funktsiooni CryptProtectData kutse väljundit. Saad luua ja salvestada krüpteerimisandmeid registrisse ASP.NET Settings Registry Console rakendusega (Aspnet_setreg.exe), mis kasutab krüpteerimise lõpetamiseks CryptProtectData't. Aspnet_setreg.exe ja Visual C++ lähtekoodi ning abi allalaadimiseks külastage veebisaitiwww.asp.netja otsi "aspnet_setreg".

Sa peaksid seadistama juurdepääsu registrivõtmetele, mis salvestavad krüpteeritud mandaadid nii, et ligipääs oleks saadaval ainult administraatoritele ja SYSTEMile. Kuna registrivõtit loeb ASP.NET protsess, mis töötab SYSTEM-ina, peaksid seadistama järgmised õigused:

Administrators:F

SYSTEM:F

LOOJA OMANIK: F

ProcessAccount:R

See pakub kahte kaitseliini andmete kaitsmiseks:

ACL-i õigused nõuavad juurdepääsu andmetele administraatori identiteediga.
Ründaja peaks serveris käivitama koodi (CryptUnprotectData), et taastada konto mandaad.

näide

Järgmine näide toob välja mitu <processModel> konfiguratsiooniseadet.

Järgmine näide täpsustab, et krüpteeritud kasutajanimi ja parool on salvestatud registri kasutaja määratletud üksuse AspNetProcess alla.

Nõuded

  • Lisatud: <system.web>
  • Veebiplatvorm: IIS 5.0, IIS 5.1, IIS 6.0
  • Konfiguratsioonifailid: Machine.config, Web.config
  • Konfiguratsiooni sektsiooni haldaja: System.Web.Configuration.ProcessModelConfigurationHandler


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





Eelmine:C# määrab, kas üleslaaditud fail on pilt, ja takistab Trooja hobuse üleslaadimist
Järgmine:C-keele e-raamatukogu jagamine
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com