C ++ App Supera memoria, ma non utilizza la memoria virtuale
-
27-09-2019 - |
Domanda
Ho un'applicazione che alloca memoria con 'nuovo' e li libera con 'delete' in alcune parti del codice. Il problema è che ogni volta che supera il limite di memoria del sistema (diciamo 2GB), Windows invia un segnale KILL al processo. Penso che non è usuale in quanto si deve utilizzare lo spazio di swap (penso in finestre si chiama memoria virtuale), giusto? La mia domanda è scritto in C ++ / Visual Studio.
Soluzione
Ecco come si può fare fino a 3GB per un processo; Questo è il massimo assoluto si può avere per 32 applicazioni Windows bit. Altro che quello e si sta andando ad avere bisogno di utilizzare una versione a 64 bit di Windows.
Questo è un sacco di memoria. forse si potrebbe pensare di dividere la vostra applicazione in più processi e comunicare tra di loro.
Altri suggerimenti
Il sistema operativo non uccide la vostra applicazione, un'eccezione non gestita fa. Si vuole esaminare la vostra app con perfmon, e guardare questi contatori, working set, Byte virtuali, Byte privati. Otterrete eccezioni quando i byte riservati si avvicina a 2GB. Così i vostri byte vincolati e byte di RAM sono molto meno.
Ecco un bell'articolo su Spazio indirizzo virtuale, tra cui commesso vs riservato.
La morale della storia, non cercare di allocare quando i byte riservati si avvicina a 2 GB, per un processo a 32 bit.
Windows non utilizza segnali. Si dovrebbe ottenere l'eccezione std :: badalloc quando si esaurisce la memoria. Il che, se non rilevata, verrà eseguito automaticamente la funzione terminate (). L'eccezione è visibile nella finestra di output.
non ho guardato troppo da vicino a questo, ma si possono trovare le risposte desiderate qui:
si può allocare un grande pezzo unico di memoria (> 4GB) in C o C ++?