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

Threads & Processus C++ Discussion :

Consommation mémoire du processus


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut Consommation mémoire du processus
    Bonjour,

    Je sais que le sujet a déjà été traité, mais j'ai des soucis de cohérence dans mes résultats depuis ce matin.

    En gros, je traque les fuites mémoire. Pour celà, j'utilise le code suivant dans une méthode statique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
        DWORD pid = GetCurrentProcessId();
        //size_type result;
        HANDLE hProcess;
        PROCESS_MEMORY_COUNTERS pmc;
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,pid);
        if (GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)))
        {
    WorkingSetSize:
            result = pmc.WorkingSetSize; // memoire utilisé par le code
        }
        CloseHandle( hProcess );
    Pour tester mon procédé, j'ai d'abord fait un test simple :
    * getProcMemory
    * malloc(1000*sizeof(double))
    * getProcMemory
    La différence de mémoire mesurée (en octets donc) est originale : 4096 octets
    Si j'alloue 10000 double, j'ai une mémoire mesurée de 81920 ... (pas vraiment 10 fois plus)

    En debug, j'ai 4096 octets de différence rien qu'en fesant
    * getProcMemory
    * getProcMemory
    mais rien en Release (0 octets) !!

    Je commence a douter sérieusement de GetProcessMemoryInfo() ... ou alors je l'utilise mal...
    Faut il necessairement un process séparé ?
    Y a t il des restrictions ?

    Comment mesurer précisément la mémoire utilisée par le processus courant par une autre méthode sinon ?

    Merci de votre aide.

    Ange_blond

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    Par défaut
    <MSDN>
    WorkingSetSize
    The current working set size, in bytes.
    </MSDN>

    Vous confondez la mémoire utilisée et WorkingSet.
    Enfin, mémoire utilisée c'est un peu vague. Ca veut dire quoi utilisée ?
    -réservée en mémoire virtuelle ?
    -adossé à une page physique de mémoire ?
    -page swapé sur disque ?
    -etc..

    Le WorkingSet n'est que la taille de l'ensemble des pages physiques de mémoire attribuée à ce process. C'est la mise en swap d'une partie du code ou des données où leur retour en mémoire qui influence le plus cette taille.

    C'est normal que votre workingSet ne suive pas votre allocation mémoire à la lettre.
    Un malloc peu utilisé de la mémoire déjà utilisé précédemment et déjà libéré par votre code mais non restitué à l'OS.
    Une partie de l'allocation n'est qu'une réservation de la plage d'adresse virtuelle dans l'espace d'adressage du programme. La récupération de la page physique se fera sur un défaut de page.
    etc...

    Gros WorkingSet, problème de localité du code ou des données.
    "Petit" WorkingSet, programme correctement optimisé.

  3. #3
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    Bonjour,

    D'abord merci de votre réponse.

    Citation Envoyé par bacelar Voir le message
    Vous confondez la mémoire utilisée et WorkingSet.
    Enfin, mémoire utilisée c'est un peu vague. Ca veut dire quoi utilisée ?
    -réservée en mémoire virtuelle ?
    -adossé à une page physique de mémoire ?
    -page swapé sur disque ?
    -etc..
    A vrai dire j'en sais rien... Je cherche a connaitre la taille de mémoire allouée par le processus, pour pouvoir faire les différence avant/apres création d'un objet et traquer les fuites mémoire.
    Je n'ai pas de meilleure idée pour faire ça...


    Je ne connais rien sur les pages, la gestion de la mémoire virtuelle et tout le reste... mais j'ai bien compris que je n'irai pas loin avec ma méthode.

    Auriez vous peut etre une autre méthode a me proposer ?

    Merci beaucoup :-)

  4. #4
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    Personnellement, j'utilise l'outil valgrind qui est simple à utiliser et donne les fuites mémoires (les erreurs d'allocations, de delete..).

    C'est précis et efficace.

  5. #5
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    Citation Envoyé par seeme Voir le message
    Personnellement, j'utilise l'outil valgrind qui est simple à utiliser et donne les fuites mémoires (les erreurs d'allocations, de delete..).
    J'en ai entendu parler oui, mais comme je suis sous windows...

  6. #6
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 399
    Par défaut
    sous windows il y a visual leak detector, la crt (_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF )

    après je ne sais pas si ça marche ailleurs que sous visual studio.

Discussions similaires

  1. Enregistrement de la consommation mémoire d'un processus
    Par hilibili dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/03/2014, 20h28
  2. Suivi consommation mémoire d'un processus
    Par lamorkytu dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 04/12/2009, 22h28
  3. [TStringGrid] Consommation mémoire
    Par spender dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/03/2006, 21h48
  4. [Consommation mémoire] Quoi utiliser pour trouver?
    Par doudine dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 25/01/2006, 13h50
  5. Réponses: 4
    Dernier message: 09/11/2005, 13h32

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