Bonjour,
question bête :
Si on ajoute un objet dans une collection, puis si on le supprime en faisant objet.finalize(); cela le supprime-t-il aussi de la collection?
Merci![]()
Bonjour,
question bête :
Si on ajoute un objet dans une collection, puis si on le supprime en faisant objet.finalize(); cela le supprime-t-il aussi de la collection?
Merci![]()
Non.
La méthode finalize ne sert à rien, qu'à embrouiller le bon peuple des programmeurs et des programmeuses.
Ah bon? Donc pour vraiment détruire un objet comment tu fais?![]()
Tu fais rien.
Si les objets de la collection ne sont réellement plus utilisés (plus référencés) ils seront détruits automatiquement.
Oui, par rapport à ta collection il suffit de faire collec.remove(tonObjet), et si cet objet n'est référencé nulle part ailleurs, alors le ramasse miette le nettoiera de la mémoire à l'occasion.
Ceci dit, la méthode finalize n'est pas totalement injustifiée.
Si l'objet contient des références sur des fichiers (par exemple), cette méthode permettra de libérer les ressources.
Sinon, pour le reste, c'est tout à fait ça, tu ne maîtrises pas la mémoire utilisée par un objet, ni le moment où elle sera libérée une fois éligible au Garbage Collector. Le fait de l'appeler (System.gc()n'y change pas grand chose d'ailleurs...
A+
Pour compléter sur finalize, depuis l'arrivée des WeakReference, sa nécessité d'usage se réduit aux cas tordus.
Par exemple pour les fichiers, en quoi est-ce nécessaire d'utiliser cette méthode ? close() ne suffit pas ? Ou dans la conception d'une classe qui contient en interne des ressources à libérer, on ne peut pas créer une méthode style dispose(), que l'on demande d'appeler explicitement, comme on le fait pour Frame, Graphics, et tant d'autres choses ?
Des explications plus complètes à How to Handle Java Finalization's Memory-Retention Issues.
Question bête : si l'objet est toujours présent dans une Collection, il y est donc référencé, non ?Envoyé par Tommy31
Donc le GC ne le supprimera pas de la mémoire. Si ?
Heu, donc j'ai bon ??Envoyé par gifffftane
si l'object est toujours dans la Collection, il y est référencé, donc il ne sera pas supprimé par le GC.
D'où la nécessité de faire le collec.remove(obj), en le mettant, à la limite, dans le finalize()....
Partager