IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Comprendre utilisation mémoire


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut Comprendre utilisation mémoire
    Bonjour

    j'ai une petite question :

    j'ai fait une application qui regarde toutes les x secondes qu'un processus soit lancé dans le gestionnaire des taches de Windows et s'il n'est pas lancé, ben je le lance

    je fais ma boucle avec un do-while et dans un thread

    je voudrais savoir pourquoi mon application fait 12 504 ko au démarrage puis augmente toutes les x secondes par palier jusqu'a 15 342 ko pour retomber au 12 504 du départ pour remonter jusqu'a 15 342 et retomber ... et ainsi de suite ...

    pourquoi mon utilisation en mémoire bouge alors que je ne stocke rien

    comment "stabiliser" mon utilisation en mémoire ? est-ce possible ?

    merci

    @++

    KaloOopS

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    .net est un langage managé, une variable prend de la mémoire et un processus s'occupe de référencer toutes les variables utilisées et par qui
    il y a un garbage collector sur un thread séparé qui quand on le sollicite va vider de la ram tout ce qui n'est plus utilisé (soit windows lui demande parce qu'une autre appli a besoin de mémoire, soit parce qu'il voit qu'il a le temps etc...)
    donc tu ne peux pas trop gérer toi même l'utilisation de la mémoire

    en pratique c'est beaucoup plus complexe que ca, et on doit regarder comment ca fonctionne quand on a une appli qui prend largement plus que 15Mo de ram

    si tu veux savoir comment ca fonctionne, ca va faire pas mal de lecture ; à googler :
    garbage collector
    mémoire managée / mémoire non managée
    IDisposable / finalize
    portée des variables

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 198
    Points : 106
    Points
    106
    Par défaut
    Tu as essayé en sortant la déclaration des variables en dehors du do_while ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par AsPrO Voir le message
    Tu as essayé en sortant la déclaration des variables en dehors du do_while ?
    ben il ne me semble pas en avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
            private void LaunchApp()
            {
                strProcess = textBox1.Text;
                strStartApp = textBox2.Text;
     
                do
                {
                    // pause de 3 secondes = 3000 ms
                    Thread.Sleep(3000);
     
                    // on lance l'application si elle n'existe pas
                    if (Process.GetProcessesByName(strProcess).Length <= 0)
                    {
                        try
                        {
                            Process.Start(strStartApp);
                        }
                        catch { }
                    }
     
                    // check if thread is cancelled
                    if (m_EventStopThread.WaitOne(0, true))
                    {
                        // inform main thread that this thread stopped
                        m_EventThreadStopped.Set();
     
                        return;
                    }
     
                    // fin boucle quand processus a demarre
                } while (Process.GetProcessesByName(strProcess).Length > 0);
            }
    @++

    KaloOopS

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Tu en a bien plusieurs:
    Process.GetProcessByName() fait bien des allocations (oui c'est un tableau) de la classe Process.

    Sinon un truc qui n'a rien avoir avec le problème de base, mais rien n’empêche ta boucle de se terminer anormalement, en effet rien ne garantie qu'entre le moment ou tu lance le process, et ou tu vérifies dans le "while" qu'il existe encore.
    Le mieux serait de boucler sur le "m_EventStopThread.WaitOne(300, true)"

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    .Net est précisément conçu (en fin par que pour ça ) pour éviter de gérer la mémoire. Ca empêche pas de la faire manuellement si besoin, vi des appels explicites au GC, via la libération correcte de grosses ressources mémoire non managées (par exemple, si on gère des buffers pour des I/O, si on gère des images, ...)

    Mais là, juste un petit tableau qui fait au max 20 éléments dont chacun prend peanuts en mémoire puisque ce n'est qu'un set d'informations pour un process donné, il faut juste ne pas penser à la mémoire.
    En dessous de 50 ou 100 megs, regarder l'évolution de la mémoire du process n'a aucun sens, puisque nos machines étant fortement pourvues aujourd'hui, le framework a rarement besoin de déclencher des collectes, chose qu'il ne fait rappellons le que si nécessaire, notamment quand windows lui signale que la mémoire libre restante se fait rare.

    Rensigne toi sur le concept de garbage collector, ça t'expliquera pourquoi l'occupation mémoire a un profil en dents de scie dans ton cas.

Discussions similaires

  1. Debbugae utilisation mémoire
    Par cauriera dans le forum MFC
    Réponses: 3
    Dernier message: 22/03/2006, 14h37
  2. [C#] Utilisation Mémoire croissante
    Par chnew dans le forum C#
    Réponses: 4
    Dernier message: 03/01/2006, 19h38
  3. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  4. [MFC] Utilisation mémoire
    Par CTux dans le forum MFC
    Réponses: 10
    Dernier message: 08/07/2005, 09h58
  5. Utilisation Mémoire d'une application
    Par scorplex dans le forum Composants VCL
    Réponses: 8
    Dernier message: 21/05/2005, 03h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo