Je suis l'aide de la nouvelle MemoryCache dans .Net 4, avec un max de cache de limite de taille en MO (je l'ai testé comprise entre 10 et 200 MO, sur les systèmes avec entre 1,75 et de 8 go de mémoire). Je n'ai pas mis tout moment, en fonction d'expiration sur les objets, comme je suis en utilisant le cache simplement comme un disque dur haute performance, et tant qu'il y a de l'espace, je veux qu'il a utilisés. À ma grande surprise, le cache a refusé d'expulser tout les objets, au point que j'aurais SystemOutOfMemory
des exceptions.
J'ai tiré jusqu' perfmon, wired up ma demande d' .Net CLR Memory\#Bytes In All Heaps
, .Net Memory Cache 4.0
, et Process\Private Bytes
-- en effet, la consommation de mémoire est hors de contrôle, et pas de cache garnitures ont été enregistrés.
Fait quelques recherches sur google et stackoverflowing, téléchargé et attaché le CLRProfiler, et wham: les expulsions partout! Le souvenir est resté dans des limites raisonnables basées sur la taille de la mémoire de la limite que j'avais fixé. Il a couru en mode de débogage, de nouveau, pas d'expulsions. CLRProfiler de nouveau, les expulsions.
J'ai finalement remarqué que le profileur forcée de l'exécution de l'application sans simultanées de collecte des ordures (voir aussi utile de manière Simultanée la Collecte des Ordures Question). Je l'ai désactivé dans mon application.config, et, bien sûr, les expulsions!
Cela semble être, au mieux, un scandaleux manque de documentation pour ne pas dire: cela ne fonctionne qu'avec la non-concordance de collecte des ordures -- si j'ai l'image depuis sa porté à partir de ASP.NET ils n'auront pas eu à se soucier simultanées de collecte des ordures.
Si quelqu'un d'autre a vu cela? J'aimerais obtenir quelques autres expériences là-bas, et peut-être plus instruits idées.
Mise à jour 1
J'ai reproduit le problème au sein d'une seule méthode: il semble que le cache doit être écrit en parallèle pour le cache des expulsions de ne pas le feu (simultané de collecte des ordures mode). Si il y a un certain intérêt, je vais télécharger le code de test pour un public de pensions. Je suis certainement vers l'extrémité profonde de la le CLR/GC/MemoryCache de la piscine, et je crois que j'ai oublié mon floaties...
Mise à jour 2
J'ai publié un code de test sur CodePlex à reproduire le problème. Aussi, éventuellement, de l'intérêt, de la production originale, le code est exécuté dans Azure, comme un Rôle de Travailleur. Intéressant, la modification de la GC de la simultanéité de réglage dans le rôle de l'app.config n'a aucun effet. Éventuellement Azure remplace GC paramètres comme ASP.NET? En outre, l'exécution, le code de test sous WPF vs une application de Console va produire légèrement différente expulsion des résultats.