9
votes

Comment puis-je simuler une condition de mémoire faible dans Windows 7

J'ai une application écrite en C # qui fonctionne bien, mais parfois sur le terrain, les erreurs que nous croyons sont dues à des conditions de mémoire faible ou aux interactions avec le collecteur des ordures.

Si quelqu'un est intéressé, il est décrit ici:

Impossible de lancer l'objet de type 'Nhibernate.impl.expandedQueryexpression' Pour taper 'nhibernate.linq.nhlinqexpression'

Je veux essayer de reproduire cela pour le débogage, mais ma machine de développement a trop de mémoire.

J'ai supprimé le pageFile afin que ma mémoire virtuelle soit limitée aux 12gbs de la mémoire physique de sorte que l'élimination physiquement de la RAM, qui a-t-il des suggestions sur la manière de simuler une faible condition mémoire dans un environnement de développement?

edit:
Supprimé de poser des questions sur les outils qui surveillent le collecteur des ordures?


7 commentaires

Vous semblez croire que votre Machine la mémoire matérielle a quelque chose à voir avec le processus avoir une mémoire virtuelle. Cela n'a pas été vrai depuis des décennies . N'oubliez pas que Mémoire physique et espace d'adresses de mémoire virtuelle ne rien avoir à faire avec l'autre. Le processus obtient la même quantité de mémoire virtuelle quelle que soit la quantité physique que vous avez. Plus de mémoire physique fait simplement utiliser la mémoire virtuelle plus rapide . Voulez-vous simuler d'être faible sur l'espace d'adresses de mémoire virtuelle ou sur la mémoire physique ?


Et oui, il y a beaucoup d'outils surveillant le collecteur des ordures. Obtenez vous-même un profileur de mémoire ou regardez les compteurs de parfum.


@Eric, vous avez raison et j'aurais dû être plus clair. En essayant de déboguer cela, j'ai supprimé le pageFile afin que ma mémoire virtuelle soit limitée aux 12gbs de la mémoire physique.


Quel raisonnement exact vous conduit à croire que d'une certaine mesure un manque de mémoire entraînera une exception non valide? Je trouve des questions aléatoires telles que celles-ci pourraient être plus imputables aux préoccupations de la sécurité thread-sécurité, dans ce cas particulier, certains codes à l'intérieur de la bibliothèque NHibernate ne peuvent pas être écrits pour se comporter bien sous scénarios de charge élevés. Je ne saurais certainement pas accéder à la conclusion que l'espace d'adressage virtuel disponible ou même la quantité de RAM physique de la machine a quelque chose à voir avec une exception de distribution non valide.


@James - vous avez raison et c'est exactement pourquoi j'essaie de reproduire une condition de mémoire faible, d'essayer de tester ce scénario


Je note que maintenant, vous ne simulez toujours pas ce que vous voulez simuler; N'oubliez pas que la différence entre ne pas avoir la capacité de commettre une mémoire virtuelle au stockage car il n'y a pas de stockage, même s'il y a beaucoup d'espace d'adresses et ne pas avoir la possibilité de valider une mémoire virtuelle au stockage. Parce qu'il n'y a pas d'espace d'adressage pour la cartographier. Mais une question plus importante est la suivante: pourquoi croyez-vous que votre problème a quelque chose à faire avec le manque de mémoire? Pourquoi une exception de distribution invalide devrait-elle vous conduire à croire qu'il s'agit d'un problème de mémoire, plutôt que d'une erreur de type?


@ERIC: Je ne sais pas avec certitude, je suis en train de suivre une idée d'une seule idée du forum NHibernate. En essayant de recréer les conditions décrites dans le lien incapable de lancer


9 Réponses :


0
votes

2 commentaires

Parce que ce n'est pas nécessairement répétable et donc peu fiable? Parce que le bug pourrait être réparé demain?


Il a posé une solution, cela n'a pas encore été réparé. Cela marche. Il n'a pas demandé une "façon permanente de déboguer".



0
votes

Pour surveiller l'activité de votre poubelle et votre utilisation de la mémoire de processus, vous pouvez utiliser des comptoirs de performance Windows.

Pour remplir votre bélier, pourquoi ne pas allouer un tableau assez important d'un programme C #?


1 commentaires

Parce que je pense que c'est causé par le GC et pas la mémoire elle-même



5
votes

Vous pouvez utiliser une machine virtuelle (VPC, VMware ou Virtual Box) et régler la mémoire vers le bas.

qui est plus fiable qu'un bug.

Modifier

Cette suggestion est un moyen de simuler un PC avec une mémoire moins physique. Comme indiqué dans les commentaires et dans d'autres réponses, si vous souhaitez syntoniser la mémoire virtuelle, «manger», le tas au début du processus serait une solution.


0 commentaires


3
votes

La quantité de RAM que vous avez n'est pas pertinente sur un système d'exploitation de la mémoire virtuelle comme Windows. Ne pas avoir assez seulement ralentit le programme. Ce qui compte, c'est la taille de l'espace d'adresses de mémoire virtuelle, 2 gigaoctets sur un système d'exploitation 32 bits. Définissez la plate-forme cible sur votre projet EXE sur X86 si vous avez un système d'exploitation de 64 bits.

Vous pouvez augmenter la pression de mémoire arbitraire en appelant Marshal.allOchglobal () au début de votre programme. Allouer un morceau de 500 mégaoctets. Pas plus, cela échouera facilement. Prenez plus en allouant 90 Mo de morceaux.


1 commentaires

Vous avez raison et j'aurais dû être plus clair. En essayant de déboguer cela, j'ai supprimé le pageFile afin que ma mémoire virtuelle soit limitée aux 12gbs de la mémoire physique



0
votes

Vous pouvez utiliser un programme C simple pour allouer ou essayer d'allouer des quantités arbitraires de mémoire sur le tas: xxx


1 commentaires

Cela consomme (virtuel) de la mémoire de ce processus, non du processus de l'application .NET



3
votes

Pas une réponse, mais un utilitaire très cool que j'ai trouvé chez Le projet de code - Mémoire Outil d'allocation

Introduction

Parfois, il est très utile de tester vos applications dans des situations extrêmes telles que
Ressources faibles, disque dur complet ou conditions de mémoire faible.

Cet outil couvre uniquement la dernière mémoire.
Il vous permet d'allouer autant de mémoire que cela pourrait être disponible.

outil d'allocation de mémoire


1 commentaires

Alloue un max de 2 Go, donc pas utile pour les machines 64 bits.



0
votes

Il s'agit d'un programme très simple que nous utilisons pour tester des conditions de mémoire basse sur nos serveurs Linux. Je ne l'ai jamais compilée sous Windows, mais cela devrait fonctionner.

https://github.com/julman99/eatmemory

J'espère que cela fonctionne pour vous


0 commentaires

0
votes

a trouvé cet utilitaire qui est maintenant gratuit gratuit: http://www.soft.tahionic.com / Download-MemallOC /


0 commentaires