Quando avviene un'OutOfMemonryException? Se proviamo a creare un nuovo oggetto e il garbage collector non riesce a trovare memoria libera, possiamo catturare l'eccezione; Un altro caso è che quando il CLR necessita di memoria e il sistema non può fornirla, anche l'eccezione viene lanciata. Ma a questo punto, la nostra domanda non può rilevare l'errore.
Analisi del debug del sovraplessamento di memoria (OutOfMemoryException).
Lo spazio di indirizzamento del sistema operativo a 32 bit è 4G, di cui 2G è occupato dal sistema operativo, il che significa che la memoria lasciata per il processo utente è solo 2G (il che detrae anche parte dello spazio occupato dall'immagine al caricamento del programma, generalmente si possono usare solo circa 1,6G~1,8G). Se un processo deve richiedere memoria mentre è in esecuzione e il sistema operativo non può allocargli spazio di memoria, genererà un'eccezione fuori memoria, System.OutOfMemoryException in .net (L'eccezione che viene lanciata quando non c'è abbastanza memoria per continuare l'esecuzione di un programma). Sebbene la manifestazione finale sia OutOfMemoryException, la causa può essere diversa e, prima di risolvere questo problema, è necessario analizzare lo stato attuale di utilizzo della memoria del processo per trovare la causa corretta prima di prescrivere il farmaco giusto. Ecco alcuni consigli per risolvere questi problemi.
Per maggiori informazioni, si prega di fare visita:http://blog.csdn.net/lazyleland/article/details/6704661
sistema di errore di sovrapprezzo di memoria nel pool di applicazioni iis.OutOfMemoryException
Su un ASP.NET web server, la quantità di memoria che ASP.NET può utilizzare di solito non è uguale a tutta la quantità di memoria. Nel file di configurazione machine.config, <processModel>c'è una proprietà "memoryLimit" nella sezione di configurazione, il valore di questa proprietà è un valore percentuale, il valore predefinito è "60", cioè il processo ASP.NET (puoi vedere il processo ASP.NET nel task manager, aspnet_wp in IIS5, w3wp in IIS6) può usare il 60% di tutta la memoria fisica. Quando la quantità di memoria utilizzata da ASP.NET supera questo limite, IIS inizierà a riciclare automaticamente il processo, cioè a creare un nuovo processo per gestire le richieste Http e a recuperare la memoria occupata dal vecchio processo.
Quando abbiamo un server con una memoria grande, il valore di "memoryLimit" deve essere regolato in modo appropriato. Ad esempio, se prepariamo un server con chemas-microsoft-com ffice marttag" />t="on"> memoria 4G, allora t="on">4G×60%=t="on">2.4G. Tuttavia, per i sistemi operativi Win32, tutto lo spazio di memoria che un processo può occupare è solo t="on">2G. Quando la memoria occupata dal processo ASP.NET inizia a raggiungere t="on">2G, poiché non raggiunge la "soglia di riciclaggio" di t="on">2.4G, IIS non avvierà l'operazione del processo di riciclo, ma a causa delle limitazioni di Win32 è in realtà impossibile allocare più memoria a questo processo, quindi è probabile che venga lanciata l'OutOfMemoryException. Per evitare ciò, abbiamo dovuto ridurre adeguatamente il "memoryLimit" affinché IIS potesse elaborare il riciclo prima.
Microsoft raccomanda che ASP.NET processo occupi non più del 60% della memoria, ed è meglio che il valore effettivo calcolato non superi t="on">800M. Detto ciò, per un server con t="on" > memoria 4G, è meglio impostare la proprietà "memoryLimit" su "20". Stabilire una soglia di riciclo appropriata affinché IIS possa riciclare i processi in modo tempestivo è molto importante per garantire il funzionamento stabile dell'intero server ed evitare OutOfMemoryException.
In IIS6, la soglia di riciclo per ASP.NET processi non è più determinata dalla proprietà "memoryLimit" nella sezione di configurazione, ma dalle impostazioni nella configurazione del pool di applicazioni in IIS Manager.
Tuttavia, anche se queste configurazioni sono impostate correttamente, non vi è garanzia che OutOfMemoryExceptions vengano completamente evitate, e le ragioni possono essere varie e complesse, come le operazioni di recupero della memoria che possono richiedere troppo tempo. Gli sviluppatori dovrebbero sempre ricordare di non usare e sprecare memoria inutilmente nel loro codice. :)
Se hai un server con una memoria grande e sei frustrato dal limite di usare t="on" >2G memoria nel sistema operativo Win32, ci sono due soluzioni alternative:
- Avvia il computer in modalità /3GB e segui il link dopo l'articolo sulla partecipazione al metodo
- Usa Windows Server 2003 64bit Edition
Diversi elementi per evitare il sovraplessamento di memoria
Se vuoi creare un array, assicurati che abbia la dimensione corretta.
Assicurati di avere abbastanza memoria per l'uso interno e nuovi oggetti ospitati.
Se stai programmando sul .NET Compact Framework, il runtime del linguaggio pubblico rilascia questa eccezione quando non c'è abbastanza memoria per l'uso interno o per un nuovo oggetto gestito. Per evitare questa eccezione, dovresti evitare di scrivere metodi grandi che occupano 64KB o più di memoria.
L'uso eccessivo di memoria gestita è spesso causato da:
- Leggi grandi set di dati in memoria.
- Creare troppi voci nella cache.
- Carica o scarica file di grandi dimensioni.
- Usa troppe espressioni regolari o stringhe quando analizzi file.
- Stato di visualizzazione eccessiva.
- Ci sono troppi dati o troppe sessioni nello stato della sessione.
- Questa eccezione può essere fatta quando un metodo viene chiamato su un oggetto COM e il metodo restituisce un tipo definito dall'utente che contiene un array sicuro (un array di dimensioni indefinite) con un messaggio aggiuntivo "Non abbastanza spazio di archiviazione per completare questa operazione". Questo perché il .NET Framework non può organizzare i campi strutturali con tipi di array sicuri.
Un esempio di overrun di memoria causato dall'uso improprio degli array di byte
Se il file di output è particolarmente grande, può segnalare direttamente System.OutOfMemoryException. Il modo corretto per farlo è produrre il flusso di byte del file in segmenti, ma esiste asp.net metodo pronto a posto, Response.WriteFile(filePath), che fa proprio questo.
Segue il modo corretto di scrivere:
Quando un asp.net sperimenta un sovraccarico di memoria, un modo semplice per gestirlo è recuperare subito il pool applicativo. Ma questo non risolse completamente il problema.
Sovraplessità di memoria durante la creazione di un tipo di immagine (System.OutOfMemoryException)
Codice errore: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. Nome completo);
Eccezioni che vengono lanciate quando un file aperto non è un file immagine:
MSDN: Questo metodo genera un'eccezione OutOfMemoryException se il file non ha un formato immagine valido, o se GDI+ non supporta il formato pixel del file.
Informazioni così anomale sono facilmente fuorvianti.
<processModel> elemento
Configura le impostazioni del modello di processo ASP.NET sul server web Internet Information Services (IIS). La sezione può essere impostata solo nel file <processModel> Machine.config e riguarda tutte ASP.NET applicazioni in esecuzione sul server.
Avviso: Per informazioni su questo elemento, si prega di leggere la sezione "Note".
Esempio di configurazione della struttura:
esegesi
Il sistema di configurazione del codice gestito non legge <processModel> le impostazioni di configurazione. Invece, viene letta direttamente dalla DLL non gestita aspnet_isapi.dll. I cambiamenti in questa sezione entrano in vigore dopo aver riavviato IIS.
Se installi ASP.NET su un controller di dominio, devi adottare misure speciali altrimenti l'installazione non funzionerà. Per maggiori informazioni, vedi Situato inhttp://support.microsoft.comL'articolo Microsoft nella Knowledge Base CHS315158 "Non ASP.NET può usare l'account ASPNET predefinito sui controller di dominio".
Quando ASP.NET esegue in modalità nativa IIS versione 6, utilizza il modello di processo IIS 6 e ignora <processModel> le impostazioni nella sezione. Per configurare l'identità del processo, il riciclo o altri valori del modello di processo, utilizza l'interfaccia utente di Internet Services Manager per configurare i processi worker IIS per la tua applicazione.
Il valore temporale è formattato come "ore:minuti:secondi". Se viene dato un solo numero senza due punti, il valore si assume che siano minuti; Pertanto, timeout="4" equivale a timeout="00:04:00".
Se un'applicazione ASP.NET fa riavviare ASP.NET processi worker (Aspnet_wp.exe su Windows 2000 e Windows XP Professional e W3wp.exe su Windows Server 2003) e fornisce un messaggio di errore che indica che il riavvio è dovuto a una sospetta condizione di blocco, dovrebbe aumentare impostazione responseDeadlockInterval.
Memorizza nomi utente e password nel registro
Memorizza nomi utente e password nel registro
Per criptare nomi utente e password e memorizzarli nel registro, imposta nome utente e password come segue.
userName="registry:HKLM\Software\AspNetProcess,Name"
password="registro:HKLM\Software\AspNetProcess,Pwd"
La parte della stringa che viene dopo il registro delle parole chiave e prima della virgola indica il nome della chiave del registro che ASP.NET apre. La parte dopo la virgola contiene un nome di valore stringa da cui il ASP.NET leggerà le credenziali. Sono necessarie le virgole e le credenziali devono essere memorizzate nell'unità di configurazione HKLM. Se la configurazione è formattata erroneamente, ASP.NET non avvierà il processo worker e successivamente apparirà nel percorso del codice di fallimento della creazione dell'account corrente.
Le credenziali devono essere in REG_BINARY formato e contenere l'output di una chiamata alla funzione API di Windows CryptProtectData. Puoi creare e memorizzare le credenziali di crittografia nel registro con l'applicazione ASP.NET Settings Registry Console (Aspnet_setreg.exe), che utilizza CryptProtectData per completare la crittografia. Per scaricare il codice sorgente Aspnet_setreg.exe e Visual C++ e ricevere aiuto, visita il sito webwww.asp.nete cerca "aspnet_setreg".
Dovresti configurare l'accesso alle chiavi del registro che memorizzano le credenziali criptate in modo che l'accesso sia disponibile solo per gli Amministratori e il SISTEMA. Poiché la chiave del registro sarà letta dal processo ASP.NET che gira come SYSTEM, dovresti impostare i seguenti permessi:
Administrators:F
SYSTEM:F
PROPRIETARIO CREATORE: F
ProcessAccount:R
Questo fornirà due linee di difesa per proteggere i dati:
I permessi ACL richiedono l'accesso ai dati con l'identità di Amministratore. L'attaccante dovrebbe eseguire codice (CryptUnprotectData) sul server per recuperare le credenziali dell'account.
esempio
Il seguente esempio specifica diverse <processModel> impostazioni di configurazione.
Il seguente esempio specifica che il nome utente e la password criptati sono memorizzati nell'elemento definito dall'utente del registro AspNetProcess.
Requisiti
- Incluso: <system.web>
- Piattaforma web: IIS 5.0, IIS 5.1, IIS 6.0
- File di configurazione: Machine.config, Web.config
- Gestore di sezione di configurazione: System.Web.Configuration.ProcessModelConfigurationHandler
http://doc.51windows.net/iismmc/ ... essmodelelement.htm
|