web-dev-qa-db-fra.com

Avertissements de mémoire insuffisante Windows 10 lorsque j'ai suffisamment de mémoire disponible

J'ai eu un problème où, si mon système est en marche depuis quelques jours sans être redémarré, je vais commencer à recevoir des avertissements disant «Fermez les programmes pour éviter la perte d'informations», puis un dialogue suggérant de fermer les programmes, que je peux soit annuler, soit cliquer sur "Fermer les programmes" et Windows forcera la fermeture de tout ou partie des applications listées dans la boîte de dialogue.

J'ouvre le gestionnaire de tâches et constate qu'environ 30% seulement de ma mémoire est actuellement utilisée:

 33% Utilization

Lorsque j'ouvre le moniteur de ressources pour voir la quantité de mémoire dédiée utilisée par des applications spécifiques, l'utilisation de la mémoire est encore relativement faible:

 Resource Monitor

J'ai ce problème depuis un moment et j'ai du mal à trouver une solution. J'ai enquêté sur des causes telles qu'une fuite de pilote à l'aide de poolmon, mais je n'ai jamais rien vu dans poolmon qui corresponde à ce que d'autres ont décrit comme des drapeaux rouges pour une fuite de mémoire de pilote. Ce qui me rend particulièrement confus, c'est pourquoi Win10 me dit de fermer des applications alors que 33% seulement de la mémoire système est utilisée.

25
Brandon

Wild suppose ici.

Vous avez désactivé votre fichier d'échange en suivant les conseils d'optimisation aléatoires de quelqu'un.

Vous avez un type de pilote d’OS qui souhaite disposer d’un grand bloc de RAM physique consécutive. Mais il ne peut pas l'obtenir parce que tous les RAMphysiques ont été fragmentés au fil du temps. Et comme le fichier d'échange est désactivé, il ne peut pas effectuer de défragmentation RAM.

Activez votre fichier d'échange.

Comme je le disais, devinez sauvage.

14
Zan Lynx

Re your last Q - version abrégée: le message d'erreur concerne l'espace d'adressage virtuel "commis". Si vous regardez le graphique de charge de validation dans votre deuxième instantané d'écran, vous verrez qu'il se situe effectivement à la limite ou très près.

La quantité de RAM "libre", "disponible" ou "en cours d'utilisation" n'a pas d'importance. En particulier, une pénurie de "disponible" RAM n'est absolument pas la raison du message "mémoire insuffisante" ou "mémoire insuffisante".

La limite de validation est égale au total RAM + taille du fichier d'échange. Lorsque la mémoire réservée est allouée, elle est immédiatement chargée en "commission de charge" même si elle n'a pas encore été utilisée ... ce qui signifie qu'aucun espace mémoire RAM ni PF n'est utilisé immédiatement. L'espace physique (que ce soit dans RAM ou dans le fichier d'échange) n'est utilisé que lorsque la mémoire est réellement référencée. À partir de ce moment, il doit rester quelque part, jusqu'à ce que le programme le libère ou jusqu'à la fin du processus.

Exemple: supposons que vous n’ayez pas de fichier d'échange, votre limite de validation est donc de 16 Go (taille de votre RAM). Supposons maintenant que 8 processus essaient chacun de VirtualAlloc (MEM_COMMIT) de 1 Go. Résultat: les frais de validation sont augmentés de 8 Go. Il n'y a pas d'impact immédiat sur la RAM, cependant! C'est comme si vous achetiez un bloc de papier à la papeterie, mais vous n'aviez en réalité aucun papier. Chaque fois que vous avez besoin d'une nouvelle feuille, une feuille apparaît comme par magie. Jusqu'à ce que vous utilisiez tout le pad (la taille de la région allouée).

Supposons maintenant que chacun de ces processus n’accède en réalité qu’à 100 Mo sur 1 Go. La RAM utilisée ne serait que de 800 Mo.

Mais puisque chacun d'eux pourrait référencer la totalité de ses 1 Go, le système d'exploitation doit garantir que 8 Go de RAM + espace fichier ... eh bien, juste RAM en l'absence de Le fichier d'échange ... est maintenu disponible au cas où cela se produirait. De retour au magasin de papeterie, ils doivent garder suffisamment de papier en stock pour donner à chacun autant de feuilles qu'ils avaient achetées auparavant.

Par conséquent, le système d'exploitation doit cesser de permettre à VirtualAlloc (MEM_COMMIT) de réussir lorsque le montant en cours engagé atteint la limite.

Pourquoi? Parce que le processus est censé vérifier le résultat de VirtualAlloc pour voir s'il a réussi. Une fois que cela a été fait et constaté que l'allocation a réussi, le processus est parfaitement en droit de s'attendre à ce que ses références ultérieures à l'ensemble de la région engagée aboutissent.

Si Windows autorisait la charge de validation à dépasser la quantité d'espace disponible pour réaliser cet espace, cette attente ne pourrait pas toujours être satisfaite.

Une solution rapide consiste à augmenter la taille par défaut (= initiale) de votre fichier d'échange. D'après l'explication ci-dessus, vous devriez pouvoir voir pourquoi cela évitera le message d'erreur même si rien ne sera jamais écrit dans ce fichier. Là encore, le système d’exploitation s’assure que l’espace disponible pour tous les frais de validation est disponible s’il en a besoin. Lorsque les processus allouent de la mémoire dédiée, ils disent simplement "hé, OS, j'ai peut-être besoin de cela". Cela ne signifie pas qu'ils l'utiliseront réellement, et cela ne signifie certainement pas qu'ils l'ont déjà utilisée.

Pour plus, voir ma réponse ici .

Maintenant .... pourquoi vous utilisez beaucoup de commit lorsque vos processus ne semblent pas s’ajouter, c’est une autre question. Pour commencer à regarder cela, veuillez afficher l'onglet Performance du gestionnaire de tâches, section Mémoire.

15
Jamie Hanrahan