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

Langage Java Discussion :

garbage collector et finalize() Comment les utiliser ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Par défaut garbage collector et finalize() Comment les utiliser ?
    Bonjour,

    voici mon programme :

    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
    33
    34
     
    public class Chien{
     
    	private String nom, aboiement;
    	private static int numero = 0 ;
    	private int numeroperso = 0 ;
     
    	public Chien(){
    	nom = "Toutou";
    	aboiement = "wouf";
    	numero++;
    	numeroperso = numero;
    	}
     
    	public Chien(String nom, String aboiement){
    	this.nom = nom;
    	this.aboiement = aboiement;
    	numero++;
    	numeroperso = numero;
    	}
     
    	public int getIdent(){
    	return numeroperso;
    	}
     
    	public int getIdentMax(){
    	return numero;
    	}
     
    	protected void finalize() throws Throwable{
    	if(this == null) // je ne suis pas sure du tout que ça doit commencer comme ca...
    	{}
    	}
    }
    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
     
    public class TestChien{
     
    	public static void main(String args[]){
     
    	Chien B = new Chien("Médor", "aaaa");
    	System.out.println(B.getIdent());
    	Chien C = new Chien("Bill", "waaaf");
    	Chien D = new Chien("Bill2", "waaaf2");
    	System.out.println(C.getIdent());
    	Chien A = new Chien();
    	System.out.println(A.getIdent());
    	System.out.println(B.getIdent());
    	System.out.println(C.getIdentMax());
    	A = B;
    	B = C;
    	D = null;
    	System.out.println(A.getIdent());
    	System.out.println(B.getIdent());
    	System.gc();	
    	System.out.println(A.getIdent());
    	System.out.println(B.getIdent());
    	System.out.println(D.getIdent());
    	}
    J'utilise System.gc() pour obliger le programme à lancer le garbage collector. Je voulais tout d'abord savoir si le garbage collector sert bien à supprimer les objets (ou à libérer la case mémoire : quelle est la différence ?) qui sont null.
    Quand je lance TestChien, il veut bien le compiler mais lors de l'exécution, il y a une erreur car c'est normal, D = null
    Si j'ai bien compris, ma méthode finalize() se lance toute seule (pas besoin de l'appeler dans main) mais je ne sais pas quoi écrire dedans : est-ce qu'elle est bien sensée supprimer les objets ? Est-ce la même chose que le garbage collector ou un outil du garbage collector ?

    Je dois aussi créer une variable et la/les méthode/s nécessaire/s pour savoir environ le nombre de chiens dans le programme.

    Est-ce que mon objet Chien D est bien candidat au ramasse miette ? Comment savoir qu'il a été ramassé ?
    Et aussi : à quoi sert protected ?

    J'ai bien regardé les tutoriels mais je ne trouve pas de détails sur l'utilisation du ramasse miette.

    Merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    En fait, c'est assez simple, il n'y a pas besoin de redéfinir la méthode finalize() sauf peut-être dans certains cas. De plus, tu ne peux même pas garantir que cette méthode sera appellée une fois dans ton programme.

    D est bien candidat au ramasse-miettes en effet, mais rien ne dit quand le gc va s'en débarasser... De plus, il est aussi déconseillé d'utiliser System.gc(), car rien ne permet d'être sûr qu'il viendra tout de suite et ca risque de ralentir ton programme. Le mieux avec le gc c'est de le laisser fonctionner tout seul.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Par défaut
    C'est un exercice de TP et on nous demande d'utiliser System.gc

  4. #4
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Citation Envoyé par HighSchool2005
    C'est un exercice de TP et on nous demande d'utiliser System.gc
    Si ton prof insinue qu'en utilisant System.gc() ça fait passer le garbage collector qui va virer tous les objets qui ne sont plus référencés, tu peux lui dire qu'il ferait mieux re réviser un peu ses cours de java.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Si ton prof insinue qu'en utilisant System.gc() ça fait passer le garbage collector qui va virer tous les objets qui ne sont plus référencés, tu peux lui dire qu'il ferait mieux re réviser un peu ses cours de java.
    Parce que c'est pas le cas ?
    System.gc() appelle le garbage collector, sauf qu'on ne peut pas savoir quand précisement.
    Non ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Par défaut
    C'est surement moi qui me suis mal exprimée ou qui est mal compris...

    Voici le sujet après avoir créé la classe Chien et une classe Test

    Malheureusement, il est possible que certains chiens disparaissent. (par exemple lorsque le ramasse miette détecte un chien qui n'est plus référencé) Compléter la classe précédente en ajoutant une variable permettant de savoir à peu près combien de chiens sont présents dans le programme. Ajouter la ou les méthodes nécessaires à ce comptage.
    Aide : déclaration de la méthode finalize() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    protected void finalize() thows Throwable
    {
    ...
    }
    Pour tester votre code, il faudra faire en sorte que certains objets soient candidat au ramasse-miette. Il n'est pas possible de contrôler le lancement du garbage collector (à vous de trouver comment) mais on peut indiquer à la JVM que l'on souhaite appeler le ramasse-miette ce qui se fait par l'instruction System.gc
    Il dit bien qu'on ne peut pas controler le lancement du ramasse miette mais on peut l'appeler. (Quelle est la différence d'ailleurs entre l'appeler et le lancer ?)
    Le "(à vous de trouver comment)" n'a pas beaucoup de sens pour moi.
    J'espère que des personnes plus expérimentées que moi en java pourront m'aider.

  7. #7
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    on va faire une analogie :
    prend un ballon, lance dans un arbre de manière qu'il se coince. Hurle très fort en espérant que les vibrations le feront descendre ( "l'appel à la méthode" dans ton cas ), cependant s'il doit réellement descendre, ce seront les lois de la physique qui le feront ( "le lancement de la méthode par la JVM" dans ton cas ).

Discussions similaires

  1. Fuzznuc/TACG comment les utiliser?
    Par Mayeu dans le forum Bioinformatique
    Réponses: 6
    Dernier message: 01/11/2007, 16h36
  2. [VS.NET][Ressources]Comment les utiliser
    Par NicolasJolet dans le forum Visual Studio
    Réponses: 2
    Dernier message: 06/10/2006, 11h16
  3. Réponses: 1
    Dernier message: 13/12/2005, 17h48
  4. [Properties] comment les utiliser ?
    Par Kyti dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 25/03/2005, 10h37
  5. Réponses: 7
    Dernier message: 13/03/2005, 16h45

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