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. P>
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' p>
Je veux essayer de reproduire cela pour le débogage, mais ma machine de développement a trop de mémoire. P>
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? p>
edit: strong>
Supprimé de poser des questions sur les outils qui surveillent le collecteur des ordures? P>
9 Réponses :
Pourquoi ne pas utiliser un bug comme un outil? p>
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".
Pour surveiller l'activité de votre poubelle et votre utilisation de la mémoire de processus, vous pouvez utiliser des comptoirs de performance Windows. P>
Pour remplir votre bélier, pourquoi ne pas allouer un tableau assez important d'un programme C #? P>
Parce que je pense que c'est causé par le GC et pas la mémoire elle-même
Vous pouvez utiliser une machine virtuelle (VPC, VMware ou Virtual Box) et régler la mémoire vers le bas. P>
qui est plus fiable qu'un bug. p>
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. P>
vous pouvez: p>
Faire de la simulation de Windows a moins de mémoire . p>
ou, si vous voulez juste regarder, juste Surveiller le collecteur a >. P>
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. P>
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. P>
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
Vous pouvez utiliser un programme C simple pour allouer ou essayer d'allouer des quantités arbitraires de mémoire sur le tas:
Cela consomme (virtuel) de la mémoire de ce processus, non du processus de l'application .NET
Pas une réponse, mais un utilitaire très cool que j'ai trouvé chez Le projet de code - Mémoire Outil d'allocation p>
Parfois, il est très utile de tester vos applications dans des situations extrêmes telles que Cet outil couvre uniquement la dernière mémoire. p>
Ressources faibles, disque dur complet ou conditions de mémoire faible. P>
Il vous permet d'allouer autant de mémoire que cela pourrait être disponible. P>
Alloue un max de 2 Go, donc pas utile pour les machines 64 bits.
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. P>
https://github.com/julman99/eatmemory P>
J'espère que cela fonctionne pour vous p>
a trouvé cet utilitaire qui est maintenant gratuit gratuit: http://www.soft.tahionic.com / Download-MemallOC / P>
Vous semblez croire que votre Machine i> la mémoire matérielle a quelque chose à voir avec le processus i> avoir une mémoire virtuelle. Cela n'a pas été vrai depuis des décennies b>. N'oubliez pas que Mémoire physique i> et espace d'adresses de mémoire virtuelle i> 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 i>. Voulez-vous simuler d'être faible sur l'espace d'adresses de mémoire virtuelle ou sur la mémoire physique B>?
Et oui, il y a beaucoup i> 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 i> 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. i> 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