Domanda

Avendo alcuni problemi di memoria insufficiente con un processo a 32 bit in Windows, ho iniziato a utilizzare Performance Monitor per registrare determinati contatori per quel processo.

Sebbene sia normale che i byte virtuali siano superiori sia ai byte privati ​​che al working set, ho scoperto che nel mio caso c'era una differenza sostanziale, i byte virtuali erano tanto superiore sia ai byte privati ​​che al working set.

Quali operazioni specifiche e funzioni Win32/CRT (in C o C++) aumenterebbero i byte virtuali ma non i byte privati ​​e il working set?

Immagino che sarebbe una sorta di risorsa condivisa, se capisco la descrizione dei diversi contatori in Performance Monitor.


Poiché sembra esserci un po' (per usare un eufemismo) di confusione sulla convenzione di denominazione da utilizzare per i contatori di memoria in diverse versioni di Windows e anche in diverse applicazioni nella stessa versione di Windows, ho messo insieme quanto segue:

Informazioni da MSDN

Secondo MSDN - Limiti di memoria per le versioni Windows, il limite dello spazio degli indirizzi virtuali in modalità utente in Windows a 32 bit per ciascun processo a 32 bit è normalmente di 2 GB.Può contenere fino a 3 GB con IMAGE_FILE_LARGE_ADDRESS_AWARE E 4GT.

Di seguito è riportata una descrizione dei diversi contatori in Performance Monitor insieme alle colonne corrispondenti in Task Manager e la struttura Win32 che contiene le informazioni, secondo MSDN: informazioni sulle prestazioni della memoria.

Byte virtuali

Byte virtuali è la dimensione corrente, in byte, dello spazio degli indirizzi virtuali utilizzato dal processo.L'uso dello spazio degli indirizzi virtuali non implica necessariamente l'uso corrispondente del disco o delle pagine della memoria principale.Lo spazio virtuale è limitato e il processo può limitare la sua capacità di caricare le librerie.

Gestione attività XP:N / A
Vista Gestione attività:N / A
Struttura: MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual

Byte privati

Byte privati ​​è la dimensione corrente, in byte, della memoria allocata da questo processo che non può essere condivisa con altri processi.

Gestione attività XP:Dimensioni della macchina virtuale
Vista Gestione attività:Impegna dimensione
Struttura: PROCESS_MEMORY_COUNTERS_EX.PrivateUsage

Insieme di lavoro

Working set è la dimensione corrente, in byte, del working set di questo processo.Il Working Set è l'insieme di pagine di memoria toccate recentemente dai thread nel processo.Se la memoria libera nel computer è superiore a una soglia, le pagine vengono lasciate nel working set di un processo anche se non sono in uso.Quando la memoria libera scende al di sotto di una soglia, le pagine vengono tagliate dai working set.Se sono necessari, verranno reinseriti nel working set prima di lasciare la memoria principale.

Gestione attività XP:Utilizzo della memoria
Vista Gestione attività:Insieme di lavoro
Struttura: PROCESS_MEMORY_COUNTERS_EX.WorkingSetSize

È stato utile?

Soluzione

Cose che (potrebbero) aumentare i byte virtuali senza aumentare i byte privati ​​mi vengono in mente in questo momento:

  • I binari sono spesso condivisi (ad es.non privati), ma occupano uno spazio di indirizzi significativo.Questo può essere anche maggiore della dimensione del file binario

  • Utilizzo di VirtualAlloc per riservare spazio di indirizzi sequenziale senza impegnarlo/accedervi.I gestori di memoria personalizzati potrebbero farlo.

  • Utilizzando un file mappato in memoria (senza accedervi completamente)

Altri suggerimenti

Utilizzando VirtualAlloc è possibile allocare spazio di indirizzi virtuali senza allocare effettivamente memoria fisica.Ciò dovrebbe aumentare il conteggio dei "byte virtuali", ma non la dimensione del set di lavoro.

La memoria insufficiente potrebbe essere causata dall'esaurimento dello spazio degli indirizzi perché si riserva troppo spazio degli indirizzi.

Qual è il tuo linguaggio di programmazione?

Nei framework gestiti, i byte privati ​​rappresentano i dati allocati dalle risorse non gestite.Mentre i byte virtuali rappresentano l'utilizzo totale della memoria (dati non gestiti e gestiti).

Pertanto, è molto comune vedere differenze sostanziali tra byte privati ​​e virtuali in tali framework.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top