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 :

Mémoire managée VS mémoire non-managée


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 6
    Par défaut Mémoire managée VS mémoire non-managée
    Bonjour,

    Je reprends une application C# très conséquente qui a de sérieux problèmes de performance.

    En analysant la mémoire utilisée, j'ai eu une différence assez flagrante entre le résultat retourné par GC.GetTotalMemory et Process.GetCurrentProcess().WorkingSet64

    Le premier me retourne 46Mo alors que le second 226Mo.
    D'après ce que j'ai compris le premier nombre correspond à la mémoire managée et le second, à la mémoire totale utilisée.
    Est-ce que cela veut dire que cette application utilise 180Mo de mémoire non managée ?

    Merci !

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    En tout cas c'est la mémoire qui est allouée par l'OS. Reste à voir si c'est réellement utilisé.

  3. #3
    Membre chevronné
    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
    Par défaut
    Bonjour,

    Pas exactement disons qu'il y a 180Mo de nescessaire pour que tous fonctionne.

    Car WorkingSet n'est pas juste la quantité de mémoire nescessaire à tes objets.
    En gros c'est l'espace bouffé par tous le processus incluant toute les allocations du au objet, mais à aussi tous le code machine.
    De plus quand on parle d'objet alloué, on parle de tous les objets alloué, et de leur allocation réeel, cela inclus donc tous les objets du CLR que l'on a tendance à oublier (GC, compilateur, JIT, etc..), mais aussi l'overhead pour la gestion de la mémoire (les fameux 12 octects supplémentaire d'une classe)

    Il faut donc retenir qu'a l'instant T, ton processus à besoin de 46Mo pour les stocker tes objets "managés", mais que ton processus à besoin de 226Mo pour fonctionner correctement.

    Et si tu pousses le raissonement, la limite des 2Go par processus 32bit elle s'applique au WorkingSet et non à la taille que retourne le garbage collector.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 6
    Par défaut
    Merci pour ces réponses.

    Certain des objets présent dans la classe essaye de suivre le pattern DAO. Mais je constate que la classe représentant l'objet, celle qui gère son accès via une BDD (type Sql CE), celle des traitements sont une seul et même classe.

    Par exemple: un des objets les plus importants est représenté par une classe de plus de 100 000 lignes... Il peut y en avoir des centaines d'instancier a un instant T.
    Sachant que des classes comme celle-ci, l'application en contient une cinquantaine.

    Il doit y avoir aussi la BDD qui est chargée en mémoire par le processus puisqu'elle est "embarquée".

    Est ce que la taille de ces classes et tout ce que cela inclus (pointeur vers les fonctions, etc.) peut consommer ces 180Mo de mémoire ? Auquel cas respecter mieux le pattern DAO devrait réduire cette surconsommation.

  5. #5
    Membre chevronné
    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
    Par défaut
    Bonjour,

    Le seul moyen de savoir c'est d'analyser ta consommation mémoire.
    Et l'un des moyens le plus efficace c'est de passer par un profiler.

Discussions similaires

  1. afficher un contrôle non managé dans un projet managé
    Par 3aychoucha dans le forum C++/CLI
    Réponses: 2
    Dernier message: 09/09/2013, 12h34
  2. Réponses: 6
    Dernier message: 19/09/2008, 23h14
  3. Réponses: 1
    Dernier message: 26/09/2007, 17h16
  4. [C#, .net 2.0] Libération de mémoire non managée
    Par SesechXP dans le forum C++/CLI
    Réponses: 2
    Dernier message: 08/12/2006, 09h00
  5. Réponses: 2
    Dernier message: 09/08/2006, 15h06

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