12
votes

C #: simuler des fuites de mémoire

Je voudrais écrire le code suivant en C #. a) Application de petite console qui simule une fuite de mémoire. b) Application de la petite console qui invoquerait la demande ci-dessus et libérerait immédiatement simuler la gestion de la gestion de la mémoire.

En d'autres termes, l'application (B) appellerait et publierait en permanence une application (a) pour simuler la manière dont l'application de fuites de mémoire "rebelle" est contenue à la sortie de la cause racine (A).

Certains échantillons de code d'application (a) et (b) seraient très utiles.

merci


1 commentaires

Cela ressemble à des devoirs pour moi.


7 Réponses :


1
votes

Vous pouvez simuler une fuite de mémoire en ajoutant simplement des objets à une liste globale sur une minuterie.


0 commentaires

4
votes

Créez simplement des objets isisposables et ne les disposez pas! Exemples en cours d'image graphiques ou tout type de manipulateur ou de code qui branche dans le code non géré pour créer / gérer des ressources.


1 commentaires

Idisposable ne fait rien de spécial ici. Tout objet fonctionnera, tant que vous ne le laissez pas devenir inaccessible.



15
votes

L'application qui fuit peut ressembler à:

public static void Main()
{
  Process process = Process.Start("leaker.exe");
  process.Kill();
}


2 commentaires

J'ai mis en œuvre votre exemple de code. Mon fuite.exe démarre avec une utilisation de la mémoire de 6 Mo par onglet Processus de gestion de tâches. Je ne sais pas quelle propriété que je pourrais utiliser pour le mesurer ... J'obtiens plusieurs propriétés où de l'éventualité de SystemMemorysisez tout le chemin de VirtualMemorySize64, mais je ne sais pas quelle propriété correspondrait à l'utilisation de la mémoire de la mémoire. J'ai essayé d'imprimer des valeurs de la propriété mémoire pour consoler mais toujours pas de chance. S'il vous plaît aider.


Demandez à la mémoire de la mémoire de consommer de manière plus agressive en créant un tableau Byte . Essayez d'utiliser privatememorysize64 . Il devrait commencer à ramper avec le temps.



3
votes

Le ci-dessous adresse ce que vous voulez dans (a) une fuite de mémoire progressive à partir d'une application de console dans laquelle vous pouvez définir la quantité sur une fuite et la durée pour la fuir.

  1. APP Console qui mange progressivement la mémoire
  2. Le paramètre n ° 1 est la mémoire qu'il va manger en mégaoctets (c'est-à-dire 6000 est 6 concerts)
  3. Le paramètre n ° 2 est le délai progressif de chaque itération (c'est-à-dire 1000 est 1 seconde)
  4. La mémoire engagée et l'ensemble de travail sera autour du même

    Il a été conçu pour utiliser XMLNode comme objet qui prend la mémoire, car la mémoire engagée (mémoire allouée par le processus dans OS) et la mémoire de travail de travail (la mémoire réellement utilisée par le processus) serait la même. Si un type d'apprentissage est utilisé pour reprendre une mémoire, tel qu'un tableau d'octets [], le jeu de travail n'est généralement rien, car la mémoire n'est pas réellement utilisée par le processus, même si elle a été allouée.

    Assurez-vous de compiler en X64 sous les propriétés du projet sous l'onglet Build. Sinon, si c'est compilé en X32, il obtiendra une erreur de mémoire sur la limite de 1,7gigs. En X64, la mémoire qu'il mange sera assez "illimitée". xxx

    Et comme la réponse de Brian Gideon déjà recommandée, vous pouvez appeler cela à l'aide du code suivant, puis tuez le processus de votre part (B). L'exemple ci-dessous appelle MemoryHog.exe (le programme du code ci-dessus) pour manger 6 périmés et faire une pause toutes les 2 secondes xxx


0 commentaires

0
votes

J'ai créé le mien avec ce code: xxx


0 commentaires

0
votes

J'ai essayé d'utiliser l'approche, décrite dans la réponse acceptée, mais cela n'a pas fonctionné - il semble que le compilateur ou l'exécution ait optimisé cela.

J'ai trouvé la modification la plus simple qui fait ce travail: < / p> xxx

Ce code rend la demande consommer de plus en plus de mémoire.


0 commentaires

4
votes

dans une console ou gagnez une application Créez un objet (panneau1), puis ajoutez 1000 Imagebox avoir son Image Définir la propriété puis appelez < Code> panneau1.controls.clear . Toutes les commandes Picturebox sont toujours dans la mémoire et sans façon gc peuvent les collecter: xxx

la bonne façon de le faire serait xxx

Fuite de la mémoire dans Calling Controls.Clear ()

appeler la méthode transparente ne supprime pas les poignées de contrôle de la mémoire. Vous devez expliquer explicitement la méthode d'élimination pour éviter les fuites de mémoire


1 commentaires

Cela devrait être la bonne réponse. Monde réel, erreur possible.