Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 24448|Vastaus: 0

[Lähde] . Nettomuistin ylivuoto (System.OutOfMemoryException).

[Kopioi linkki]
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 lataukset
Seuraava:C-kielen e-kirjakokoelman jakaminen
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com