2016-10-18 2 views
0

J'utilise Delphi 2007, il y a donc une limite de mémoire disponible de 32 bits.Obtenir de la mémoire disponible pour un processus

Utilisation du drapeau IMAGE_FILE_LARGE_ADDRESS_AWARE PE, il devrait y avoir une limite de 3 Go au lieu de 2 Go:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} // Allows usage of more than 2GB memory 

Ceci est la méthode que j'utiliser pour obtenir l'utilisation actuelle de la mémoire du processus:

function MemoryUsed: Int64; 
var 
    PMC: _PROCESS_MEMORY_COUNTERS_EX; 
begin 
    Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @PMC, SizeOf(PMC))); 
    Result := PMC.PrivateBytes; 
end; 

Maintenant, je veux un moyen d'obtenir la quantité totale de mémoire disponible pour le processus. Il devrait être d'environ 3 Go. Mais je ne veux pas le coder en dur, car dans l'avenir nous allons passer à Delphi et 64 bits.

Quelle fonction API Win32 dois-je utiliser?

Mémoire disponible - Mémoire disponible pour ordinateurs - Peut-être 8 Go de RAM sont-ils installés. Si plus est nécessaire le système d'exploitation commence à échanger la mémoire sur le disque.

Mémoire disponible du processus - Une limitation dans l'exécutable et Windows. Maintenant, la plupart des Windows est 64 bits, ce qui n'est pas un problème. Mais si l'exécutable est compilé en 32 bits avec IMAGE_FILE_LARGE_ADDRESS_AWARE, la limite devrait être de 3 Go, n'est-ce pas? Lorsque l'exécutable est 64 bits, il sera beaucoup plus grand, peut-être 64 Go (mais l'échange peut se produire si la RAM installée est inférieure ...). Donc, ma question est, comment puis-je obtenir la mémoire disponible du processus?

+1

Définissez la mémoire disponible s'il vous plaît. Votre processus peut utiliser l'espace d'adressage complet de 4 Go sur votre système 64 bits. Il est capable d'allouer tout l'espace qui n'est pas actuellement réservé, donner ou prendre. Qu'allez-vous faire avec l'information de toute façon? –

+0

J'essaie de clarifier la question –

+0

Donc, c'est la quantité d'espace d'adressage que vous voulez. Il est soit 2, 3 ou 4. Très peu probable d'être 3. Vous ne trouverez pas beaucoup de systèmes 32 bits démarrés avec le commutateur/3gb ces jours-ci. –

Répondre

1

Il y a deux choses évidentes que vous pouvez faire. Appelez GetSystemInfo et soustrayez lpMinimumApplicationAddress de lpMaximumApplicationAddress pour trouver la quantité d'espace d'adressage disponible pour votre processus.

La quantité de mémoire physique disponible pour vous est beaucoup plus difficile à obtenir et n'est pas une quantité fixe. Vous êtes en concurrence avec tous les autres processus pour cela, et c'est donc un concept très fluide et dynamique. Vous pouvez connaître la quantité de mémoire physique disponible sur le système en appelant le GlobalMemoryStatusEx. Cela renvoie également d'autres informations, mais il est très facile de les interpréter de manière erronée. En fait, cette API vous indiquera également combien de mémoire virtuelle est disponible pour votre processus, ce qui vous donnerait les mêmes informations que dans le premier paragraphe. Peut-être que ce que vous voulez est le minimum de la mémoire physique totale et virtuelle totale. Mais je n'aimerais pas dire. J'ai vu de nombreux exemples de code qui limite inutilement sa capacité à effectuer en prenant de mauvaises décisions basées sur des statistiques de la mémoire mal interprétées.

+0

Ne devrait-il pas lpMaximumApplicationAddress? – Fritzw