Avvisi di memoria insufficiente di Windows 10 quando ho molta memoria disponibile


25

Ho avuto un problema in cui, se il mio sistema è attivo per alcuni giorni senza essere riavviato, inizierò a ricevere avvisi che dicono "Chiudi programmi per prevenire la perdita di informazioni" e quindi un dialogo che suggerisce di chiudere i programmi, che posso annullare o premere "chiudi programmi" e Windows forzerà la chiusura di alcune o tutte le applicazioni elencate nella finestra di dialogo.

Apro Task Manager e vedo che attualmente viene utilizzato solo circa il 30% della mia memoria:

33% di utilizzo

Quando apro il monitoraggio delle risorse per vedere quanta memoria impegnata viene utilizzata da applicazioni specifiche, vedo ancora un utilizzo della memoria relativamente basso:

Sorvegliante delle risorse

Ho avuto questo problema per un po 'e ho faticato a trovare una soluzione. Ho studiato cause come una perdita del driver usando poolmon, ma non ho mai visto nulla in poolmon che corrispondesse a quello che altri hanno descritto come bandiere rosse per una perdita di memoria del driver. Ciò che mi rende particolarmente confuso è perché Win10 mi sta dicendo di chiudere le applicazioni quando ho solo il 33% della memoria di sistema in uso.


3
Prova ad andare al task manager e vai alla scheda delle prestazioni. Cosa mostra il campo della memoria impegnata ?
DrZoo,

Non ho salvato uno screenshot per questo, ma la mia memoria impegnata era un'alta percentuale di disponibile, qualcosa come 17,5 gb / 19 gb.
Brandon,

Risposte:


15

Ipotesi selvagge qui.

Hai disabilitato il tuo file di scambio, seguendo i consigli casuali di "ottimizzazione" di qualcuno.

Hai un driver del sistema operativo di qualche tipo che vuole un grande blocco di RAM fisica consecutiva. Ma non può ottenerlo perché tutta la RAM fisica è stata frammentata nel tempo. E poiché il file di scambio è disabilitato, non è possibile eseguire una deframmentazione RAM.

Abilita il tuo file di scambio.

Come ho detto, ipotesi selvaggia.


Bene, ho una dimensione del file di paging impostata di max 3 GB. È questo che intendi per file di scambio o è una cosa gestita separatamente in Windows 10? Non è impossibile che avrei fatto qualcosa del genere, ho avuto problemi di prestazioni estremamente gravi quando ho costruito questa macchina per la prima volta nel 10/2015 e ho provato diverse cose come disabilitare il parcheggio principale per risolverlo. Alla fine c'è stato uno schema di gestione dell'alimentazione che stava riducendo la mia potenza a circa il 10% e morendo di fame tutti i componenti ed era per questo che avevo problemi di prestazioni sistemiche, ma è possibile che avrei potuto fare qualcosa come hai detto durante quell'episodio.
Brandon,

1
Cambia la dimensione del tuo file di paging in "Sistema gestito" e probabilmente i tuoi problemi spariranno.
Scott Chamberlain,

Una volta avevo gestito il sistema e avevo ancora lo stesso problema, ci sarebbe voluto solo più tempo per manifestarsi. Quando lo imposto su un sistema gestito, il file di paging raggiunge il massimo a 64 gb, e quindi quando l'impegno si alzava molto, ricevo comunque gli stessi avvisi di memoria insufficiente. Ma vedrei ancora disponibile circa il 70% di memoria fisica e nessuna indicazione in Resource Monitor che oltre 60+ GB di memoria sono attualmente impegnati in qualsiasi processo elencato.
Brandon,

Sono pienamente d'accordo con Zan e Scott, è il tuo file di paging che sta causando questo problema (vedi windowsitpro.com/windows-10/… per un'altra fonte che dice anche questo). Impostalo su sistema gestito e il problema if si ripresenta, ALLORA inizia a indagare.
Ƭᴇcʜιᴇ007,

Quindi penso che il file di paging gestito dal sistema sia stata la risposta principale qui. Sembra che averlo impostato su un 3gb statico non sia l'ideale nell'ambiente Windows 10. Ho implementato questa soluzione un paio di settimane fa e l'ho lasciata funzionare normalmente solo per vedere cosa è successo e mentre continuo a vedere molta più memoria impegnata di quella spiegata nella colonna Memoria impegnata di Resource Monitor, non sto esaurendo la memoria avvisi o problemi ora.
Brandon,

14

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.


Non ho parole per descrivere una risposta così perfetta. Grazie.
Vinicius Tavares,

-2

Un'altra possibilità è che stai usando Win10 a 32 bit, non a 64 bit. Mentre hai 16 GB di RAM installati, ci sono limitazioni del sistema operativo a 32 bit che rendono pratico l'utilizzo oltre 4 spotty. Inoltre, il sistema operativo imporrà limiti rigidi / per processo / su quale quantità di RAM può essere richiesta, indipendentemente dalla RAM fisica. In tal caso, non puoi fare molto altro che passare al sistema operativo a 64 bit o eseguire meno applicazioni contemporaneamente.


2
Non sarebbe possibile eseguire Win10 a 32 bit e fare in modo che Task Manager mostri un totale di 16 GB, come avviene in OQ. E a proposito, i limiti per processo che il sistema operativo pone sono sulla memoria virtuale, non sulla RAM. Non è possibile effettuare chiamate in Windows per allocare RAM di per sé . (Bene, AWE, ma questo richiede il privilegio a livello di amministratore e quasi nulla lo usa tranne alcuni programmi di sistema.) Alloca lo spazio di indirizzi virtuali (diciamo con VirtualAlloc) e poi lo usi; mentre lo usi, il sistema operativo alloca la RAM al tuo processo ("paging della domanda"). Ma ovviamente non tutto deve essere realizzato in RAM contemporaneamente.
Jamie Hanrahan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.