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 :

qu'est ce qui detruit un object


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut qu'est ce qui detruit un object
    Bonsoir à tous,

    Est-il possible de savoir ce qui a détruit/finalise un object?

    En gros si dans un code tres long existe-t-il un moyen de savoir ce qui a détruit un object pour savoir si c'est une ligne qui le met à null, le garbage collector, autres sans passer par toute les fonctions qui l'utilise?

    Merci

  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
    pour ce qui est sur la pile (variables de type struct et pointeurs de membres) c'est la sortie du bloc qui dépile et donc supprime la variable ou le pointeur
    pour les objets sur le tas c'est le GC qui libère de la mémoire

    quand il fait une passe sur toutes les instances en partant des objets vivants de départ et leurs références il sait alors quelles sont les instances non référencées et libère la mémoire
    il appelle le finaliseur s'il y en a un, le finaliseur appelle Dispose(false) si la classe implémente IDisposable
    (à noter que la mémoire est divisée en 3 selon la durée de vie des objets et qu'une passe agit sur une des 3 zone à la fois seulement)

    mettre à null ne libère jamais la mémoire instantanément

    de mémoire :
    Pour les classes gérant de la mémoire non managée, et pour les classes utilisant des classes de ce type il est recommandé d'implémenter IDisposable
    VS propose une implémentation simple ou plus complète, dans la plus complète on se retrouve avec une méthode Dispose(bool) (non public), une Dispose() et il est toujours possible d'ajouter un finaliseur/destructeur
    Dans le principe si le développeur ne l'oublie pas il appelle Dispose() (via using le cas échéant), qui lui appelle Dispose(true) et c'est ici qu'on libère la mémoire non managée / qu'on peut appeler Dispose sur les variables de classe avec de la mémoire non managée
    Si Dispose(false) est appelée ca veut dire que le GC intervient alors que le développeur n'a pas appelé Dispose, mais je pense que dans les 2 cas c'est le GC qui libère la mémoire managée
    Avec un peu de chance, Dispose ne fait que s'occuper du finaliseur, et ne libère rien dans la foulée
    car il y a aussi GC.SuppressFinalize(this) qui permet de déréférencé l'instance pour la finalisation

  3. #3
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    (à noter que la mémoire est divisée en 3 selon la durée de vie des objets et qu'une passe agit sur une des 3 zone à la fois seulement)
    Pas tout à fait. J'avais fait un article sur le fonctionnement du ramasse miette. Il y a 3 zones + 1 (et encore, ce n'est plus vraiment vrai avec les dernières versions, où il me semble que le mécanisme implémentée à un peu changé, même si grosso modo, le principe général reste le même).

    Les objets sont situés dans une zone :
    - 0 : les objets fraichement alloués
    - 1 : les objets moyen terme (grosso modo, les objets ayant survécu au 1er passage du ramasse miettes
    - 2 : les objets long terme (les objets ayant survécu à plus de 2 passages du ramasse miettes

    Lorsque le ramasse miette passe sur la zone 0, seul les objets de cette zone sont traités. Lorsqu'il passe sur la zone 1, c'est les deux zones 0 et 1 qui sont traités. Quand il passe sur la zone 2, c'est tous les objets qui sont étudiés.

    La zone +1 concerne les objets de grande taille, qui sont sur un tas à part et considérés de base comme étant des objets de génération 2.

    Citation Envoyé par Pol63 Voir le message
    mettre à null ne libère jamais la mémoire instantanément
    Tout à fait. En fait, il est même impossible d'appeler directement le destructeur d'un objet. C'est le ramasse miettes qui s'en charge au moment de la suppression d'un objet.

    Citation Envoyé par Pol63 Voir le message
    de mémoire :
    Pour les classes gérant de la mémoire non managée, et pour les classes utilisant des classes de ce type il est recommandé d'implémenter IDisposable
    VS propose une implémentation simple ou plus complète, dans la plus complète on se retrouve avec une méthode Dispose(bool) (non public), une Dispose() et il est toujours possible d'ajouter un finaliseur/destructeur
    Dans le principe si le développeur ne l'oublie pas il appelle Dispose() (via using le cas échéant), qui lui appelle Dispose(true) et c'est ici qu'on libère la mémoire non managée / qu'on peut appeler Dispose sur les variables de classe avec de la mémoire non managée
    Si Dispose(false) est appelée ca veut dire que le GC intervient alors que le développeur n'a pas appelé Dispose, mais je pense que dans les 2 cas c'est le GC qui libère la mémoire managée
    Avec un peu de chance, Dispose ne fait que s'occuper du finaliseur, et ne libère rien dans la foulée
    car il y a aussi GC.SuppressFinalize(this) qui permet de déréférencé l'instance pour la finalisation
    Pour cela, j'avais fait une synthèse dans mon article sur les bonnes pratiques à suivre

    Citation Envoyé par agparchitecture
    En gros si dans un code tres long existe-t-il un moyen de savoir ce qui a détruit un object pour savoir si c'est une ligne qui le met à null, le garbage collector, autres sans passer par toute les fonctions qui l'utilise?
    Pour les objets en général, non, ce n'est pas possible. Pour les objets implémentant l'interface IDisposable, c'est plus ou moins possible au niveau de la méthode Dispose(bool isDisposing) qui prend un booléen indiquant si la libération des ressources (et non destruction de l'objet, attention) est appelé depuis le destructeur (isDisposing = false) ou depuis la méthode Dispose() (isDisposing = true).

    Le mécanisme est explicité dans l'article que j'ai cité juste au dessus

  4. #4
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut
    Ok merci pour votre retour et éclaircissement.

    Je vais donc "tracer" mon listview afin de savoir à quel moment il disparait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Qu'est ce qui ne va pas dans ma requête ???
    Par Higestromm dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/09/2018, 21h50
  2. qu'est ce qui va pas dans cette fonction???
    Par access001 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/04/2006, 13h10
  3. qu'est-ce qui cloche dans ma requete select??
    Par a-chan dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/07/2005, 11h35
  4. qu'est-ce qui cloche dans ma requete?
    Par a-chan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/06/2005, 09h02
  5. Réponses: 1
    Dernier message: 21/02/2005, 12h40

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