2011-01-30 5 views
3

Je charge plusieurs assemblys externes dans mon application lors de l'exécution. Et j'ai besoin de limiter une quantité de mémoire qui peut être utilisée par une classe spécifique qui est définie dans chacun des assemblages externes, par exemple, 10 mb par instance, sinon on obtient OutOfMemory.Comment limiter une mémoire pouvant être allouée par une classe spécifique?

J'ai recherché sur Google la meilleure façon de procéder et trouvé des informations sur CLR Runtime Hosting. Cela semble être la chose dont j'ai besoin, mais je ne trouve pas de bons exemples. Est-ce que quelqu'un peut partager les exemples de code ou peut-être quelques liens sur la gestion de la mémoire en utilisant CLR Runtime Hosting? Ou peut-être existe-t-il de meilleures solutions pour limiter la quantité de mémoire par classe?

Merci d'avance.

+0

Ceci est un sujet intéressant. Cependant, pourriez-vous élaborer un peu plus * pourquoi sur une base par classe *? Peut-être y a-t-il une autre solution évidente si vous débloquez votre pensée des instances de classe. –

+0

En fait, il n'est pas si important de limiter sur une base par classe. Une classe de type exact est la seule chose que je vais instancier, c'est pourquoi mes pensées étaient "verrouillées" avec les instances de classe :). Je peux le faire, par exemple, dans l'appdomain (créer chaque instance dans l'appdomain), mais je ne trouve pas le moyen de limiter une memmory pour chaque appdomain :(Mon but est de limiter en quelque sorte une mémoire disponible pour 'external – Andrey

Répondre

4

Ce n'est pas quelque chose que vous serez capable de faire grâce à l'hébergement CLR. Si vous hébergez le CLR, vous pouvez répondre aux exigences d'allocation du GC vers Windows, par ex. de sorte qu'au lieu de VirtualAlloc, il utilise un autre allocateur. Cependant, l'hôte n'est pas invoqué chaque fois qu'un objet est alloué (ce serait trop cher).

Vous pouvez théoriquement accomplir cela en utilisant l'API CLR Profiling. Cela vous permet de recevoir un rappel chaque fois qu'un objet est alloué. J'ai peur, cependant, que vous essayiez de regarder cela du mauvais point de vue. Au lieu de limiter la quantité de mémoire utilisée par les instances d'une classe, ce qui est très granulaire, pourriez-vous plutôt essayer d'isoler ces assemblages externes dans des processus séparés, éventuellement en les limitant à l'aide des API Win32 Job Object?

+0

Théoriquement, il peut y avoir des centaines d'assemblages de ce type et ils sont dans une sorte d'interaction, c'est pourquoi j'ai peur d'isoler chacun d'entre eux dans un processus séparé.Mais bien sûr, s'il n'y a plus d'options pour limiter De mémoire, sauf par processus, je n'ai pas le choix :) Merci pour votre réponse – Andrey

+0

D'après mon expérience, la procédure standard dans ces cas serait d'exécuter plusieurs assemblys de plug-ins dans un processus séparé, peut-être chacun dans un AppDomain distinct. En général, vous avez probablement votre "code" en qui vous avez confiance et le code "autre" que vous n'avez pas, donc il n'y a pas trop de couches d'isolation. –

0

Si vous visez est limiter la consommation de mémoire de processus individuelle, je pense que vous devez utiliser la propriété 'MaxWorkingSet' de classe de processus. Voir http://msdn.microsoft.com/en-us/library/system.diagnostics.process.maxworkingset.aspx pour les détails

+0

Mon but est de limiter la quantité de mémoire pour chaque instance de classe spécifique en 1 processus – Andrey

+0

Vérifiez ce fil http://stackoverflow.com/questions/4752439/memory-usage-of-class-instance-in-c –

+0

I ' Je n'ai trouvé que le moyen de déterminer combien de mémoire est déjà utilisée. Mais ma question est de savoir comment empêcher un 'développeur' externe d'utiliser plus que, par exemple, 10 mb. Il n'est pas correct pour moi d'autoriser l'allocation de tout, puis de vérifier la quantité de mémoire allouée. – Andrey

Questions connexes