2013-01-06 14 views
68

Ricevo un'eccezione di memoria insufficiente nella mia applicazione C# quando l'utilizzo della memoria per l'applicazione supera circa 1,3 GB.Eccezione memoria insufficiente .NET - utilizzata da 1,3 GB ma 16 GB installati

Ho avuto questo stesso problema su una macchina a 32 bit con 3 GB di memoria e aveva senso, ma ora ho aggiornato l'hardware a una macchina a 64 bit con 16 GB di memoria con la scheda madre high-end e la RAM ma l'eccezione di memoria insufficiente si verifica ancora dopo 1,3 GB!

So che non ci sono singoli oggetti su 2 GB e 1,3 è meno del 2 GB in ogni caso, in modo che il limite in-built MS 2GB su un singolo oggetto non è probabile che sia il problema ...

Sembra come se ci fosse un kill-switch di Windows di qualche tipo quando un'app raggiunge una certa soglia di utilizzo della memoria ... Allora dovrebbe esserci un modo per configurare questo nel Registro di sistema, forse?

Qualsiasi aiuto sarà molto apprezzato!

+9

Il sistema operativo è a 64 bit? – fge

+8

Anche se il sistema operativo è a 64 bit, assicurarsi che il processo sia anche a 64 bit (o AnyCPU) – Knowleech

+0

Quale versione di .NET? –

risposta

77

Non v'è alcuna differenza fino a quando si compila alla stessa architettura di destinazione. I supponiamo che si stia compilando per l'architettura 32 bit in entrambi i casi.

Vale la pena ricordare che OutOfMemoryException può anche essere sollevato se si ottiene 2GB di memoria allocata da una singola collezione in CLR (diciamo List<T>) su entrambe le architetture 32 e 64 bit.

Per poter beneficiare della bontà di memoria su architettura 64 bit, è necessario compilare il il codice mira 64 po 'architettura. Dopodiché, naturalmente, il tuo binario verrà eseguito a solo per su 64 bit, ma trarrà vantaggio dalla possibilità di avere più spazio disponibile nella RAM.

+8

Che dire di AnyCPU? – dtb

+1

Sì, anche AnyCPU è un'opzione, in cui è disponibile un'opzione per il codice dipendente dall'architettura JIT. Tuttavia, il targeting dell'architettura specifica rimane ancora vantaggioso nei casi in cui si dispone di risorse (ad esempio) non gestite. Non ho idea di cosa sia l'architettura di OP. – Tigran

+4

Lo sapevo :) - Grazie Tigran, ho ricostruito la soluzione in x64 e l'eccezione è andata via. – Paceman

2

Sembra che tu abbia un arco a 64 bit, ma una versione a 32 bit del runtime .NET e/o una versione a 32 bit di Windows.

E come tale, lo spazio degli indirizzi disponibile per il processo è sempre lo stesso, non è stato modificato rispetto alla configurazione precedente.

aggiornamento sia per un sistema operativo a 64 bit e una versione a 64 bit di .NET;)

1

L'applicazione è in esecuzione come processo a 64 o 32 bit? È possibile verificarlo nel task manager.

Potrebbe essere, è in esecuzione come 32 bit, anche se l'intero sistema è in esecuzione su 64 bit.

Se 32 bit, una libreria di terze parti potrebbe causare questo. Ma prima assicurati che la tua applicazione sia compilata per "Any CPU", come indicato nei commenti.

52

Come già accennato, la compilazione dell'app in x64 offre molta più memoria disponibile.

Ma nel caso si deve costruire un app in 86, c'è un modo per aumentare il limite di memoria da 1,2GB a 4GB (che è il limite effettivo per i processi a 32 bit):

Nel VC/cartella bin della directory di installazione di Visual Studio, deve esistere un file .Così nel mio installazione di default lo trovo sotto

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe 

Al fine di far funzionare il programma, forse è necessario eseguire vcvars32.bat nella stessa directory prima. Poi un

editbin /LARGEADDRESSAWARE <your compiled exe file>

è sufficiente per lasciare il vostro programma di utilizzare 4 GB di RAM. <your compiled exe file> è l'exe, che VS ha generato durante la compilazione del progetto.

Se si desidera automatizzare questo comportamento ogni volta che si compila il progetto, utilizzare il seguente evento di post-generazione per il progetto eseguito:

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
    call "$(DevEnvDir)..\tools\vsvars32.bat" 
    editbin /largeaddressaware "$(TargetPath)" 
) 

Nota a margine: Lo stesso può essere fatto con la devenv.exe di lasciare a vista Studio utilizza anche 4 GB di RAM anziché 1,2 GB (ma prima effettua il backup del vecchio devenv.exe).

+0

Soluzione abbastanza carina. Grazie; Per me va bene! – MiBol

+0

Benedici la tua anima, autore. Mi hai salvato! – cubrman

+0

Grazie mille. Questo funziona per me. Ma abbiamo dei problemi identificati dopo aver aumentato il limite di memoria a 4 GB. – Maverick

10

Vale la pena ricordare che l'impostazione predefinita per una compilazione "Qualsiasi CPU" ora controlla la casella di controllo "Prefer 32 bit". Essendo impostato su AnyCPU, su un sistema operativo a 64 bit con 16 GB di RAM può ancora colpire un'eccezione di memoria insufficiente a 2 GB se è selezionata.

Prefer32BitCheckBox

Problemi correlati