Question

Avoir quelques hors-mémoire des problèmes avec un processus 32 bits dans Windows I commencé à utiliser Analyseur de performances pour connecter certains compteurs pour ce processus.

Bien qu'il soit normal que Octets virtuels est plus élevé que les deux octets privés et Plage de travail, je trouve que dans mon cas, il y avait une différence importante, Virtual Bytes était beaucoup supérieur à deux octets privés et de travail Set.

Quelles sont les opérations et les fonctions spécifiques Win32 / CRT (en C ou C ++) augmenterait Octets virtuels mais pas privés Bytes et Set de travail?

Je suppose que ce serait une sorte de ressources partagées, si je comprends la description des différents compteurs dans Analyseur de performances.


Comme il semble y avoir certains (pour le moins) la confusion sur la convention de nommage à utiliser pour les compteurs de mémoire dans les différentes versions de Windows et dans différentes applications dans la même version de Windows, je mets ensemble les éléments suivants:

Informations MSDN

Selon MSDN - Limites de mémoire pour rejets de Windows , le mode d'emploi limite d'espace d'adressage virtuel dans Windows 32 bits pour chaque processus 32 bits est normalement de 2 Go. Il peut être jusqu'à 3 Go avec IMAGE_FILE_LARGE_ADDRESS_AWARE et 4GT.

Voici une description des différents compteurs dans Analyseur de performances ainsi que les colonnes correspondantes dans le Gestionnaire des tâches et la structure Win32 qui contient les informations, selon MSDN -. information sur le rendement de la mémoire

Octets virtuels

  

Octets virtuels est la taille actuelle, en octets, de l'espace d'adressage virtuel utilisé par le processus. Utilisation de l'espace d'adressage virtuel ne signifie pas nécessairement une utilisation correspondante de disque ou des pages de mémoire principale. L'espace virtuel est fini, et le processus peut limiter sa capacité à charger des bibliothèques.

Gestionnaire des tâches XP: N / A
Gestionnaire des tâches Vista: N / A
Structure: MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual

Octets privés

  

Octets privés est la taille actuelle, en octets, de mémoire que ce processus a alloué ne peut pas être partagé avec d'autres processus.

Gestionnaire des tâches XP: VM Taille
Gestionnaire des tâches Vista: Engagez Taille
Structure: PROCESS_MEMORY_COUNTERS_EX.PrivateUsage

Set de travail

  

Set de travail est la taille actuelle, en octets, du jeu de travail de ce processus. Le jeu de travail est l'ensemble des pages de mémoire modifiés récemment par les threads du processus. Si la mémoire libre dans l'ordinateur est au-dessus d'un seuil, les pages sont laissés dans le jeu de travail d'un processus, même si elles ne sont pas utilisées. Lorsque la mémoire libre tombe en dessous d'un seuil, les pages sont parés à partir de jeux de travail. Si elles sont nécessaires, ils seront alors faillée doux retour dans le jeu de travail avant de quitter la mémoire principale.

Gestionnaire des tâches XP: Mem Utilisation
Gestionnaire des tâches Vista: Set de travail
Structure: PROCESS_MEMORY_COUNTERS_EX.WorkingSetSize

Était-ce utile?

La solution

Les choses qui (peut) augmenter octets virtuels sans augmenter octets privés, je peux penser à ce moment:

  • Binaires sont souvent partagés (à savoir non privée), mais occupent l'espace d'adressage important. Cela peut être encore plus grande que la taille du fichier binaire

  • Utilisation VirtualAlloc pour réserver l'espace d'adressage séquentiel sans engager / y accéder. Les gestionnaires de mémoire personnalisée peut le faire.

  • L'utilisation d'un fichier de mémoire mappée (sans complètement y accéder)

Autres conseils

En utilisant VirtualAlloc, vous pouvez allouer de l'espace d'adressage virtuel sans allouer réellement une mémoire physique. Cela devrait augmenter le nombre « octet virtuel », mais pas votre taille de travail.

de mémoire pourrait être causée par l'exécution de l'espace d'adressage en raison de réserver l'espace d'adressage trop.

Quelle est votre langage de programmation?

Dans les cadres gérés, les octets privés représentent les données qui sont affectées par des ressources non gérés. Alors que les octets virtuels représentent l'utilisation de la mémoire totale (données non gérées et gérées).

Ainsi, il est très fréquent de voir des différences importantes entre les octets privés et virtuels dans ces cadres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top