Que devient un objet oublié

Résolu/Fermé
Messages postés
152
Date d'inscription
mardi 4 mai 2004
Statut
Membre
Dernière intervention
8 octobre 2008
-
Messages postés
5366
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
6 décembre 2021
-
Bonjour,
Imaginons que je crée un objet a partir d'un classe contenant des threads, et tout un tas de variables... pui un peu plus loin je remplace mon objet par un nouveu provenant de la meme classe
Main{
   MyClass C;
   C=new MyClass("toto", "tata");
   ..........
   ..........
   C=new MyClass("titi", "tutu");   
}
Est on certain que toute la mémoire et le thread alloué lors de la prmière création sont supprimés?
Merci.
PS: pour ceux qui ne comprenent pas mon code vous pouvez remplacer ("toto", "tata") par ("A","B")

3 réponses

Messages postés
764
Date d'inscription
mardi 25 mai 2004
Statut
Membre
Dernière intervention
8 mars 2011
8
Oui, mais tu sais pas quand !!! C est le principe du garbagecollector, tu peux néanmoins l appeler dynamiquement si tu veux
pour savoir comment ca marche :
http://gfx.developpez.com/tutoriel/java/gc/
+++ Toinou
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Il faut tout de même être sûr de ne pas avoir de copie de la référence de l'objet quelque part !
Messages postés
5366
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
6 décembre 2021
111
Salut,


pour completer si tu
as dans tes variables des vecteur et autres truc du gout tu peux
definir la methode finalize(destructeur en java herité de Object)
exemple :


public class Toto{

    Vector vec = ....

    .....

    protected void finalize() throws Throwable{

       vec.clear();

       vec = null;

    }

}


ainsi quand le finalizer passera le menage sera complet cela dis tu peux force le menage toi meme :


System.runFinalization();//active la finalization des objets

//ou

//Runtime.getRuntime().runFinalization();//active la finalization des objets

System.gc();//invoque le garbage collector

void java.lang.Runtime.runFinalization()

Runs the finalization methods of any objects pending finalization.
Calling this method suggests that the Java virtual machine expend
effort toward running the
finalize
methods of objects that have been found to be discarded but whose
finalize

methods have not yet been run. When control returns from the method
call, the virtual machine has made a best effort to complete all
outstanding finalizations.

The virtual machine performs the finalization process automatically as needed, in a separate thread, if the
runFinalization
method is not invoked explicitly.

The method System.runFinalization() is the conventional and convenient means of invoking this method.

* See Also: : <dd>java.lang.Object.finalize()


pour le gc tu peux faire un truc plus complet :


public class GC {

   

    private static final Runtime   
        RUNTIME   
        = Runtime.getRuntime();


    private GC() {  }


    public static void runGC() {

        long usedMem1 usedMemory(), usedMem2 Long.MAX_VALUE;

        for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) {

            RUNTIME.runFinalization();

            RUNTIME.gc();

            Thread.yield();


            usedMem2 = usedMem1;

            usedMem1 = usedMemory();

        }

    }


    public static long usedMemory() {

        return RUNTIME.totalMemory() - RUNTIME.freeMemory();

    }

}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA