La meilleure façon d'éviter de mémoire exception dans l'application
Nous travaillons à la conception d'un Test de Stress de l'Application qui va les envoyer en masse des requêtes HTTP de "taille de 1 MO" à un Service Web. Pour obtenir de stress, nous sommes à l'utilisation de plusieurs threads dans l'application. La Structure est quelque chose que nous avons X EnqueueThreads qui permettront de créer le HTTPRequest de données et ils l'ajouter à la file d'attente. Et la Y WorkerThreads dequeue la demande et qu'ils vont présenter au service web.
Toutes les demandes sont aysnchronous.
Maintenant, le problème, ici, c'est la File de threads de travail beaucoup plus rapide que WorkerThreads donc si il n'y a pas d'arrêt/attente de condition, ils ajoutent de la demande jusqu'à la sortie de la mémoire exception est levée, et donc de faire de l'injecteur (où cet utilitaire va être en cours d'exécution) lent.
A présent, nous sommes la manipulation de l'OutOfMemory exceptions et de faire le enqueuethreads sommeil pendant un certain temps. Une autre façon, je pense limiter la taille de file d'attente.
Cependant, j'aimerais connaître le point de vue sur ce que devrait être la meilleure approche à utiliser le peu de ressources système (notamment la mémoire).?
Merci à l'avance.
Vous devez vous connecter pour publier un commentaire.
Bien, selon le sujet de la question, la meilleure manière d'éviter de mémoire exception serait de ne pas créer des objets qui remplissent cette mémoire.
Manipulation exception est la solution la plus simple, mais peut porter les différentes difficultés et incohérences dans l'application avec le temps. Une autre façon serait de se faire disponible de la taille de la mémoire de ressources comme ceci:
Ensuite, vous pouvez calculer la longueur de la file d'attente basé sur l'estimation d'un objet de la capacité mémoire.
Une autre façon serait de vérifier pour la taille de la mémoire dans chaque thread. Quand il n'y a pas de mémoire, le fil peut tout juste d'en terminer. De cette façon, le nombre de threads serait de frai et de mourir, mais l'application devrait être au maximum de la capacité disponible.
Vous pouvez et devriez probablement utiliser le MemoryFailPoint classe dans un scénario comme celui-ci.
Si vous obtenez une OutOfMemoryException ensuite l'état de l'application pourrait être endommagé et vous ne devriez pas essayer de la récupérer. MemoryFailPoint est conçu pour éviter cela en vous permettant de déterminer combien de ralentir votre application vers le bas de sorte que vous pouvez éviter de tomber à court de mémoire. Vous êtes en laissant le cadre de déterminer si vous pouvez effectuer l'opération et de ne pas prendre une conjecture sur la façon dont beaucoup vous "pensez" vous pouvez sortir avec selon la quantité de mémoire de votre application à l'aide.
Vous devez également vérifier l'utilisation de la mémoire par le garbage collector pas le processus pour obtenir une lecture précise de la quantité de mémoire géré est effectivement alloués. L'aide privée taille de la mémoire va vous donner une beaucoup plus faible de lecture et vous pourriez encore de la terre, de la mémoire situation même si il semble que vous avez beaucoup à perdre.
L'exemple de code sur la page MSDN montre comment estimer l'utilisation de la mémoire pour un fonctionnement et à utiliser cette information à attendre jusqu'à ce que la mémoire est disponible avant d'essayer de traiter plus de demandes. Si vous pouvez déterminer les zones de code qui ont de grandes exigences de mémoire c'est une bonne option pour limiter le mouvement et éviter d'être à court de mémoire.