Tiré dans l'obscurité...
Vous avez un maximum de 4 Go, mais vous avez 24 Go de mémoire physique. 4 Go est la quantité maximale d'espace d'adressage utilisateur dont dispose un processus 32 bits sur un système d'exploitation Windows 64 bits. Essayez d'exécuter le programme en tant que processus 64 bits de manière explicite. Mon intuition me dit qu'il s'exécute en tant que processus 32 bits.
VS : Project Properties -> Build -> Platform target : x64
Mise à jour
Après avoir défini ma plate-forme en x64, le code suivant sur mon système dépasse un ensemble de travail de 4 Go. Il ne peut pas dépasser ce seuil car je teste sur un système avec 6 Go de mémoire, et il n'y a tout simplement pas assez de mémoire pour dépasser 4,2 Go. Je dispose d'un serveur avec 24 Go de mémoire, mais je suis réticent à l'utiliser pour ce test ! :)
Je suppose que dans votre commentaire, lorsque vous dites que votre système utilise 12 Go de RAM avec votre programme, il s'agit de la consommation totale. mémoire virtuelle l'utilisation, et non mémoire physique usage. PeakWorkingSet64 fait référence à la mémoire physique.
J'ai placé quelques bidouillages dans le code pour m'assurer que les données générées sont touchées de manière à ce qu'elles restent chaudes et dans la mémoire physique et non dans la mémoire paginée (la mémoire paginée n'est pas incluse dans les chiffres de l'ensemble de travail car elle se trouve dans le fichier de pagination et non dans la mémoire physique réelle). Windows met agressivement en page la mémoire sur le disque si elle n'est pas touchée.
Console.WriteLine("Is64=" + (Marshal.SizeOf(IntPtr.Zero) == 8));
Process p = Process.GetCurrentProcess();
List<int[]> data = new List<int[]>();
while (true)
{
int[] buffer = new int[1024 * 1024 * 128]; //<- 0.5GB
data.Add(buffer);
int touch = 0;
foreach (var b in data)
{
for (int i = 0; i < b.Length; i++)
{
touch += b[i];
}
}
p.Refresh();
int mb = (int)(p.PeakWorkingSet64 / (float)1024 / 1024);
Console.WriteLine("ignore" + touch);
Console.WriteLine(mb + "MB");
Thread.Sleep(1 * 1000);
}
Sortie :
ignorer0
524MB
ignorer0
1055MB
ignorer0
1560MB
ignorer0
2074MB
ignorer0
2587MB
ignorer0
3101MB
ignorer0
3615MB
ignorer0
4132MB
ignorer0
4188MB
Note importante
Assurez-vous que le processus qui utilise le PeekWorkingSet64 est un processus 64 bits. À ma grande surprise, un processus 32 bits qui essaie d'obtenir le PeekWorkingSet64 d'un autre processus 64 bits, n'obtiendra que 4096 Mo comme utilisation maximale de la mémoire, même si le processus surveillé est 64 bits et possède plus de mémoire physique que cela.