|
|
Julkaistu 14.3.2019 21.47.39
|
|
|
|

Milloin OutOfMemonryException syntyy? Jos yritämme luoda uuden objektin eikä roskien kerääjä löydä vapaata muistia, voimme havaita poikkeuksen; Toinen tapaus on, että kun CLR tarvitsee muistia eikä järjestelmä pysty sitä tarjoamaan, poikkeus heitetään myös. Mutta tässä vaiheessa hakemuksemme ei pysty havaitsemaan virhettä.
Muistin ylivuodon virheanalyysi (OutOfMemoryException).
32-bittisen käyttöjärjestelmän osoiteavaruus on 4G, josta käyttöjärjestelmä vie 2G:n, mikä tarkoittaa, että käyttäjäprosessille jäljellä oleva muisti on vain 2G (joka myös vähentää osan kuvan tilasta ohjelman latauksen yhteydessä, yleensä käytetään vain noin 1,6G~1,8G). Jos prosessi tarvitsee pyytää muistia käynnissä ollessaan, eikä käyttöjärjestelmä voi varata sille muistitilaa, se tuottaa muistin ulkopuolisen poikkeuksen, System.OutOfMemoryException in .net (poikkeus, joka heitetään silloin, kun muistia ei ole tarpeeksi ohjelman suorittamiseen). Vaikka lopullinen ilmentymä on OutOfMemoryException, syy voi olla eri, ja ennen tämän ongelman ratkaisemista on tarpeen analysoida prosessin nykyinen muistin käyttötila oikean syyn löytämiseksi ennen oikean lääkkeen määräämistä. Tässä muutamia vinkkejä tällaisten ongelmien virheenkorjaukseen.
Lisätietoja saat osoitteesta:http://blog.csdn.net/lazyleland/article/details/6704661
iis Application Pool Memory Overflow Error System.OutOfMemoryException
ASP.NET verkkopalvelimella ASP.NET käyttämä muistimäärä ei yleensä vastaa kaikkea muistia. machine.config-konfiguraatiotiedostossa <processModel>on ominaisuus "memoryLimit", jonka arvo on prosenttiluku, oletusarvo on "60", eli ASP.NET-prosessi (näet ASP.NET-prosessin tehtävienhallinnassa, aspnet_wp IIS5:ssä, w3wp IIS6:ssa) voi käyttää 60 % kaikesta fyysisestä muistista. Kun ASP.NET:n käyttämä muistimäärä ylittää tämän rajan, IIS alkaa automaattisesti kierrättää prosessia, eli luo uuden prosessin käsittelemään Http-pyyntöjä ja ottaa takaisin vanhan prosessin käyttämän muistin.
Kun palvelimella on suuri muisti, "memoryLimit"-arvoa täytyy säätää asianmukaisesti. Esimerkiksi, jos valmistelemme palvelimen chemas-microsoft-com ffice marttags" />t="on"> 4G-muistilla, niin t="on">4G×60%=t="on">2.4G. Win32-käyttöjärjestelmissä kuitenkin kaikki prosessin muistitila on vain t="on">2G. Kun ASP.NET-prosessin täyttämä muisti alkaa saavuttaa t="on">2G, koska se ei saavuta "kierrätyskynnystä" t="on">2.4G, IIS ei käynnistä kierrätysprosessia, mutta Win32:n rajoitusten vuoksi tälle prosessille on itse asiassa mahdotonta varata lisää muistia, joten OutOfMemoryException todennäköisesti heitetään. Tämän välttämiseksi meidän piti pienentää "muistirajaa" asianmukaisesti, jotta IIS pystyi käsittelemään kierrätyksen aikaisemmin.
Microsoft suosittelee, että ASP.NET prosessi vie enintään 60 % muistista, ja on parasta tehdä lasketusta todellisesta arvosta enintään t="on">800M. Sanottakoon, että palvelimelle, jolla on t="päällä" > 4G-muisti, on parasta asettaa "memoryLimit"-ominaisuus arvoksi "20". Sopivan kierrätyskynnyksen asettaminen IIS:lle prosessien kiireelliseen kierrätykseen on erittäin tärkeää koko palvelimen vakaan toiminnan varmistamiseksi ja OutOfMemoryExceptionin välttämiseksi.
IIS6:ssa ASP.NET prosessien kierrätyskynnys ei enää määräydy konfiguraatio-osiossa olevan "memoryLimit"-ominaisuuden mukaan, vaan sovelluspoolin konfiguraatioiden asetuksista IIS Managerissa.
Kuitenkin, vaikka nämä asetukset asetettaisiin oikein, ei ole takeita siitä, että OutOfMemoryExceptions -poikkeamat vältettäisiin kokonaan, ja syyt voivat olla vaihtelevia ja monimutkaisia, esimerkiksi muistin palautusoperaatiot voivat olla liian aikaa vieviä. Kehittäjien tulisi aina muistaa, ettei koodissa saa käyttää ja tuhlata muistia turhaan. :)
Jos sinulla on palvelin, jolla on suuri muisti ja turhaut t="päällä" >2G-muistin käyttörajoituksiin Win32-käyttöjärjestelmässä, on olemassa kaksi vaihtoehtoista ratkaisua:
- Käynnistä tietokone /3GB-tilassa ja seuraa linkkiä metodiosallistumisartikkelin jälkeen
- Käytä Windows Server 2003 64bits Editionia
Useita elementtejä muistin ylivuodon välttämiseksi
Jos haluat luoda taulukon, varmista, että se on oikean kokoinen.
Varmista, että sinulla on tarpeeksi muistia sisäiseen käyttöön ja uusiin isännöityihin objekteihin.
Jos ohjelmoit .NET Compact Frameworkilla, julkisen kielen ajonaikajärjestelmä heittää tämän poikkeuksen, kun sisäistä käyttöä tai uutta hallittua objektia ei ole tarpeeksi. Tämän poikkeuksen välttämiseksi sinun tulisi välttää suurten metodien kirjoittamista, jotka vievät vähintään 64KB muistia.
Liiallinen hallitun muistin käyttö johtuu usein seuraavista tekijöistä:
- Lue suuria tietoaineistoja muistiin.
- Liian monien välimuistissa olevien merkintöjen luominen.
- Lataa tai lataa suuria tiedostoja.
- Käytä liikaa säännöllisiä lausekkeita tai merkkijonoja tiedostojen analysoinnissa.
- Liiallinen katselutila.
- Istuntotilassa on liikaa dataa tai liikaa istuntoja.
- Tämä poikkeus voidaan ottaa esiin, kun metodia kutsutaan COM-objektilla ja metodi palauttaa käyttäjän määrittelemän tyypin, joka sisältää turvallisen taulukon (määrittelemättömän kokoisen taulukon) lisäviestillä "Ei tarpeeksi tallennustilaa tämän operaation suorittamiseen". Tämä johtuu siitä, että .NET Framework ei voi järjestää rakenteellisia kenttiä turvallisilla taulukotyypeillä.
Esimerkki muistin ylikuormituksesta, joka johtuu tavutaulukoiden väärinkäytöstä
Jos tulostiedosto on erityisen suuri, se voi suoraan raportoida System.OutOfMemoryException. Oikea tapa tehdä tämä on lähettää tiedoston tavuvirta segmenteinä, mutta on olemassa asp.net valmis menetelmä Response.WriteFile(filePath), joka tekee juuri tämän.
Seuraava on oikea tapa kirjoittaa:
Kun asp.net kokee muistin ylivuodon, helppo tapa käsitellä sitä on ottaa sovelluspooli heti takaisin. Mutta tämä ei täysin ratkaissut ongelmaa.
Muistin ylivuoto kuvatyypin luomisessa (System.OutOfMemoryException)
Virhekoodi: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. Koko nimi);
Poikkeuksia, joita heitetään, kun avoin tiedosto ei ole kuvatiedosto:
MSDN: Tämä menetelmä heittää OutOfMemoryException-poikkeuksen, jos tiedostolla ei ole kelvollista kuvamuotoa tai jos GDI+ ei tue tiedoston pikselimuotoa.
Tällainen epänormaali tieto on helposti harhaanjohtavaa.
<processModel> alkio
Määritä ASP.NET prosessimallin asetukset Internet Information Services (IIS) -verkkopalvelimella. Osio voidaan asettaa vain Machine.config-tiedostossa <processModel> , ja se vaikuttaa kaikkiin palvelimella pyöriviin ASP.NET sovelluksia.
Varoitus Lisätietoja tästä elementistä saat lukemalla "Muistiinpanot"-osiosta.
Esimerkki rakenteen konfiguroinnista:
eksegeesi
Hallittu koodin konfigurointijärjestelmä ei <processModel> lue konfiguraatioasetuksia. Sen sijaan sitä lukee suoraan hallitsematon DLL-aspnet_isapi.dll. Tämän osion muutokset astuvat voimaan, kun käynnistät IIS:n uudelleen.
Jos asennat ASP.NET toimialueen ohjaimelle, sinun täytyy tehdä erityisiä toimenpiteitä, muuten asennus ei toimi. Lisätietoja löytyy kohdasta Sijaitseehttp://support.microsoft.comMicrosoftin artikkeli Knowledge Basessa CHS315158 "ASP.NET ei voi käyttää oletus-ASPNET-tiliä toimialueen ohjaimilla".
Kun ASP.NET pyörii IIS version 6 natiivitilassa, se käyttää IIS 6 -prosessimallia ja <processModel> sivuuttaa osion asetukset. Prosessiidentiteetin, kierrätyksen tai muiden prosessimalliarvojen konfigurointiin käytä Internet Services Manager -käyttöliittymää IIS-työprosessien konfigurointiin sovelluksellesi.
Aikaarvo muotoillaan muotoon "tunnit:minuutit:sekunti". Jos vain yksi luku annetaan ilman kaksoispistettä, arvoksi oletetaan minuutteja; Siksi timeout="4" vastaa timeout="00:04:00".
Jos ASP.NET-sovellus saa ASP.NET työntekijäprosessit (Aspnet_wp.exe Windows 2000:ssa ja Windows XP Professionalissa sekä W3wp.exe Windows Server 2003:ssa) käynnistymään uudelleen ja antaa virheilmoituksen, joka viittaa uudelleenkäynnistykseen epäillystä deadlock-tilanteesta, sen pitäisi lisääntyä responseDeadlockInterval-asetus.
Tallenna käyttäjätunnukset ja salasanat rekisteriin
Tallenna käyttäjätunnukset ja salasanat rekisteriin
Käyttäjätunnusten ja salasanojen salaamiseksi ja niiden tallentamiseksi rekisteriin aseta käyttäjänimi ja salasana seuraavasti.
userName="rekisteri:HKLM\Software\AspNetProcess,Name"
password="rekisteri:HKLM\Software\AspNetProcess,Pwd"
Merkkijonon osa, joka tulee avainsanarekisterin jälkeen ja pilkun edellä, osoittaa rekisteriavaimen nimen, jonka ASP.NET avataan. Pilkun jälkeinen osa sisältää merkkijonon arvonimen, josta ASP.NET lukee tunnistetiedot. Pilkut vaaditaan ja tunnistetiedot on tallennettava HKLM-konfiguraatioyksikköön. Jos konfiguraatio on väärin muotoiltu, ASP.NET ei käynnistä työntekijäprosessia ja ilmestyy sen jälkeen nykyisen tilin luomisen virhekoodin polulle.
Tunnistetietojen on oltava REG_BINARY muodossa ja sisältävä Windowsin API-funktio CryptProtectData -kutsun tulos. Voit luoda ja tallentaa salaustiedot rekisteriin ASP.NET Settings Registry Console -sovelluksella (Aspnet_setreg.exe), joka käyttää CryptProtectDataa salauksen suorittamiseen. Lataa Aspnet_setreg.exe ja Visual C++ -lähdekoodia sekä apua verkkosivuiltawww.asp.netja hae "aspnet_setreg".
Sinun tulisi konfiguroida pääsy rekisteriavaimiin, jotka tallentavat salatut tunnistetiedot, niin, että pääsy on saatavilla vain ylläpitäjille ja SYSTEMille. Koska rekisteriavain luetaan ASP.NET-prosessissa, joka toimii SYSTEM-muodossa, sinun tulisi asettaa seuraavat oikeudet:
Administrators:F
SYSTEM:F
TEKIJÄ OMISTAJA:F
ProcessAccount:R
Tämä tarjoaa kaksi puolustuslinjaa datan suojaamiseksi:
ACL-oikeudet edellyttävät pääsyn tietoihin, joiden henkilöllisyys on Administrator. Hyökkääjän täytyisi ajaa koodia (CryptUnprotectData) palvelimella palauttaakseen tilin tunnukset.
esimerkki
Seuraava esimerkki määrittelee useita <processModel> konfiguraatioasetuksia.
Seuraava esimerkki määrittelee, että salattu käyttäjätunnus ja salasana tallennetaan rekisterin käyttäjän määrittelemässä kohteessa AspNetProcess.
Vaatimukset
- Sisältyy: <system.web>
- Verkkoalusta: IIS 5.0, IIS 5.1, IIS 6.0
- Konfiguraatiotiedostot: Machine.config, Web.config
- Konfiguraatioosion käsitelijä: System.Web.Configuration.ProcessModelConfigurationHandler
http://doc.51windows.net/iismmc/ ... essmodelelement.htm
|
Edellinen:C# määrittää, onko ladattu tiedosto kuva, ja estää Troijan hevosen latauksetSeuraava:C-kielen e-kirjakokoelman jakaminen
|