De Mémoire d'Exception
Je suis en train de travailler sur une application web à l'aide de C# et asp.net j'ai reçu un mémoire d'exception. Ce que l'app n'est lire un tas d'enregistrements(produits) provenant d'une source de données, peut être des centaines/milliers de processus, de ces documents par le biais de paramètres dans l'assistant, puis met à jour une source de données différente avec le processus d'information sur le produit. Bien qu'il existe plusieurs DB classes, dès maintenant, toute la logique est dans une grande classe. La seule raison pour cela, toutes les informations de a à faire avec une chose, un produit. Serait-il aider à la mémoire, si j'ai divisé mon application dans les différentes classes?? Je ne pense pas que ce serait parce que si j'ai divisé la logique métier en deux classes, les deux classes de rester en vie tout le temps d'envoyer des messages les uns aux autres, et je ne sais donc pas comment cela pourrait l'aider. Je suppose que mon autre solution serait de savoir quelle est l'aspiration de la mémoire. Est-il un bon outil que vous pourriez recommander??
Grâce
OriginalL'auteur jumbojs | 2009-02-03
Vous devez vous connecter pour publier un commentaire.
Êtes-vous à l'aide de datareaders de flux par le biais de vos données? (pour éviter de charger trop de mémoire)
Mon intuition me dit c'est une question triviale à corriger, ne pas pomper les tables de données avec 1 million d'enregistrements, le travail à travers des tableaux d'une ligne, ou en petits lots ... la Libération et de disposer des objets lorsque vous avez terminé avec eux. (Exemple: vous n'avez pas
static List<Customer> allCustomers = AllCustomers()
)Avoir un développement règle qui garantit que personne ne lit les tables en mémoire s'il y a plus de X nombre de lignes concernées.
Si vous avez besoin d'un outil de débogage regarder .net memory profiler ou windbg avec l'extension sos à la fois vous permettra de sniffer par le biais de votre géré tas.
Une autre note, si vous vous souciez de la maintenabilité et souhaitez réduire vos défauts, se débarrasser de la SuperDuperDoEverything classe et le modèle correctement l'information d'une manière qui est mieux aligné avec votre nom de domaine. Le SuperDuperDoEverything classe est une bombe prête à exploser.
OriginalL'auteur Sam Saffron
Notez également que vous pourriez ne pas être à court de mémoire. Ce qui se passe est que .NET va chercher des blocs de mémoire contigus, et s'il ne trouve pas tout, il jette un OOM - même si vous avez beaucoup de mémoire totale à couvrir la demande.
Quelqu'un référencés à la fois Perfmon et WinDBG. Vous pouvez également le programme d'installation adplus pour capturer un vidage de la mémoire sur crash - je crois que la syntaxe est
adplus -crash -iis
. Une fois que vous avez le vidage de la mémoire, vous pouvez faire quelque chose comme:Et qui vous donnera une idée de ce que votre grand-objets de mémoire.
Et de cours, consultez Tess Fernandez excellent blog, par exemple cet article sur Les Fuites de mémoire avec XML Sérialiseurs et la façon de les résoudre.
Si vous êtes en mesure de repro dans votre environnement de dev, et vous avez VS Team Edition pour les Développeurs, il y a des profileurs de mémoire intégrée. Il suffit de lancer une nouvelle session de performance, et d'exécuter votre application. Il va cracher un rapport de ce qui est accroché autour de.
Enfin, assurez-vous que vos objets ne pas définir un destructeur. Ce n'est pas le C++, et il n'y a rien de déterministe, autres que les garanties de votre objet sera de survivre un tour de la Collecte des Ordures, car il doit être placé dans le finaliseur file d'attente, puis nettoyé la prochaine ronde.
OriginalL'auteur Cory Foy
une très chose de base que vous pourriez vouloir essayer est, redémarrez visual studio (en supposant que vous utilisez) et voir si la même chose se passe, et oui libérant des objets sans attente pour le garbage collector est toujours une bonne pratique.
pour résumer,
et vous pouvez toujours essayer ce,
http://msdn.microsoft.com/en-us/magazine/cc337887.aspx
OriginalL'auteur z3r0 c001
J'ai trouvé le problème. Tout en faisant ma boucle, j'ai eu une collection qui n'a pas été effacé et ainsi de données tout simplement continuer d'être ajouté.
OriginalL'auteur jumbojs
Commencer avec Perfmon; Il y a un certain nombre de compteurs pour GC infos. Plus que probablement vous êtes une fuite de mémoire(sinon le GC serait la suppression d'objets), ce qui signifie que vous êtes toujours référencement des structures de données qui ne sont plus nécessaires.
OriginalL'auteur Matt Davison
Vous devriez diviser en plusieurs classes de toute façon, juste pour le plaisir d'une saine conception.
Sont que vous allez fermer votre DB connections? Si vous êtes en train de lire des fichiers, êtes-vous de fermeture/de les relâcher une fois que vous avez terminé la lecture/écriture? En va de même pour les autres objets.
Vous pourriez cycle de vos objets de classe régulièrement juste pour libérer de la mémoire.
OriginalL'auteur Mostlyharmless