Per quanto riguarda la tua ultima Q - la versione breve: il messaggio di errore riguarda lo spazio degli indirizzi virtuali "impegnati". Se guardi il grafico Commit Charge nella seconda istantanea della schermata, vedrai che è effettivamente al limite o molto vicino.
La quantità di RAM "libera", "disponibile" o "in uso" non ha importanza. In particolare una carenza di RAM "disponibile" non è assolutamente la ragione del messaggio "memoria insufficiente" o "memoria insufficiente".
Il limite di commit è uguale alla dimensione totale della RAM + del file di paging. Quando viene allocata la memoria di commit, viene immediatamente caricata in "commit charge" anche se non è stata ancora effettivamente utilizzata ... il che significa che non viene utilizzato immediatamente spazio RAM o PF. Lo spazio fisico (sia nella RAM che nel file di paging) viene utilizzato solo quando si fa effettivamente riferimento alla memoria. Da quel momento in poi deve avere un posto dove stare, fino a quando il programma lo libera, o l'intero processo termina.
Esempio: supponiamo di non avere un file di paging, quindi il limite di commit è di 16 GB (la dimensione della RAM). Supponiamo ora che 8 processi provino ciascuno a VirtualAlloc (MEM_COMMIT) 1 GB. Risultato: la commissione di commit viene aumentata di 8 GB. Tuttavia, non vi è alcun impatto immediato sulla RAM! È come se avessi comprato un blocco di carta al negozio di articoli di cartoleria, ma in realtà non hai ricevuto carta. Ogni volta che hai bisogno di un nuovo foglio, però, ne appare uno magicamente. Fino a quando non si utilizza l'intero pad (la dimensione della regione allocata).
Supponiamo ora che ciascuno di questi processi acceda effettivamente a 100 MB su 1 GB. La RAM utilizzata sarebbe solo 800 MB.
Ma poiché ognuno di essi potrebbe fare riferimento a tutti i suoi 1 GB, il sistema operativo deve garantire che 8 GB di RAM + spazio per il file di paging ... beh, solo la RAM in caso di nessun file di paging ... sia mantenuta disponibile nel caso in cui ciò accada . Tornando al negozio di articoli di cartoleria, devono tenere abbastanza carta in magazzino per dare a tutti quanti fogli che avevano acquistato in precedenza.
Di conseguenza, il sistema operativo deve smettere di consentire a VirtualAlloc (MEM_COMMIT) di avere successo quando l'importo corrente impegnato raggiunge il limite.
Perché? Perché il processo dovrebbe verificare il risultato di VirtualAlloc per vedere se è riuscito. Una volta che lo ha fatto e scoperto che l'allocazione ha avuto successo, il processo ha tutto il diritto di aspettarsi che i suoi successivi riferimenti all'intera regione impegnata avranno successo.
Se Windows consentiva alla commissione di commit di superare la quantità di spazio disponibile per realizzare quello spazio, tale aspettativa non poteva sempre essere soddisfatta.
Una soluzione rapida è aumentare la dimensione predefinita (= iniziale) del file di paging. Dalla spiegazione precedente dovresti essere in grado di capire perché questo eviterà il messaggio di errore anche se nulla potrebbe mai essere scritto in quel file . Ancora una volta, il sistema operativo garantisce che sia disponibile spazio per tutti i costi di commit nel caso in cui ne abbia bisogno . Quando i processi allocano memoria impegnata, dicono semplicemente "ehi, sistema operativo, potrei averne bisogno così tanto". Ciò non significa che lo useranno effettivamente, e certamente non significa che lo abbiano ancora usato.
Per di più, vedi la mia risposta qui .
Ora .... perché stai usando così tanto commit quando i tuoi processi non sembrano sommarsi ad esso è un'altra domanda. Per iniziare a guardarlo, mostra la scheda Prestazioni del Task Manager, sezione Memoria.