Salut
Coment être sur qu'un objet a été ramassé par le garbage collector, sinon comment forcer la terminaison de cet objet.
[ Modéré par Greg01 ]
-> Modification du tag dans le titre.
-> Merci de respecter les règles des forums Java.
Salut
Coment être sur qu'un objet a été ramassé par le garbage collector, sinon comment forcer la terminaison de cet objet.
[ Modéré par Greg01 ]
-> Modification du tag dans le titre.
-> Merci de respecter les règles des forums Java.
pour qu'un objet soit garbage collecté, il faut qu'il ne soit plus référencé par personne!
cela veut dire que toutes les références qui pointent vers cet objet sont mises à null (ou que tous les objets qui possèdent une référence vers cet objet ne sont eu-même plus référencés par personne)
Le problème, c'est qu'il n'y a pas de solution pour compter le nombre de références vers un objet (le garbage collector y arrive, mais nous, on ne sait pas, si quelqu'un sait, je ne le savais pas, mais si c'est le cas, j'aimerais le savoir!!)
Tu peux toujours overrider la methode finalize de la classe objet, qui est appelée juste avant qu'on objet soit détruit, et là, tu imprime un string du genre : je m'appel X et je suis détruit...
Tout cela pour dire qu'en java, xi on programme très mal, il est quand même possible d'avoir des fuites de mémoire. C'est donc une bonne habitude de mettre une référence à null quand on a plus besoin d'un certain objet.
Je rajouetrais que un objet est detruit si aucune reference existe sur ce dernier mais aussi quand la place en memoire se fait rude
Donc meme si il n'existe plus de reference sur un objet tu peux attendre longtemps avant qu'il soit detruit ce n'est pas immédiat
Il va attendre que la place en mémoire se fait dur comme je disais pour ensuite faire un peu de ménage
Merci de toutes ces réponses, mais mon problème est le suivant
J'aimerais re-instancier la même classe avec des attributs complètement différents(je passe les détails), le problème est que sur la deuxième instanciation j'ai des retours de valeurs de la première fois?
Bon je pourrais faire les choses autrement mais cela implique de revoir une partie de la conception architecture et j'avoue je suis un peu faignant.
Si j'ai bien compris, je dirais que Ton problème se situe plutôt au niveau du class loader...
Mais, là, je ne suis pas sûr d'avoir compris : comment tu fais pour avoir 2 fois la même classe , mais avec des attributs différents, dans le même classpath?
Bon cette classe que j'ai besoin de mettre à jour régulièrement est une ihm dont l'aspect change(réorganisation des composants, ajout de composants ou suppression etc... la totale quoi) en fonction des données clients.
A chaque fois que le clent à besoin de la nouvelle ihm j'aimerais que la classe qui s'occupe de cette ihm soit détruite et réinstancier avec les nouvelles données.
ton probleme reviens a recreer un objet en faisant un new.
Cela override toutes les références a ton précédent objet.
Sinon pour controller les références sur un objets tu peux implementer un memoizer qui seral e seul a avoir les références, et donc une simple nullification sur cet objet enverras l'objet a la casse ( enfin le declarera candidat a la collection )..
@+
justement le new ne fonctionne que partiellement, certains attributs se retrouvant avec le même nom avec le new garde apparemment un pointeur vers ceux qui devraient être détruits.
les données "conservées" ne seraient pas "static" par hasard ?
Sauf si c static, c impossible. un new detruit l'instance courante.
Non les données ne sont pas static, c'est un private ArrayList toto
Un des boutons(jButton) de la classe réinstanciée me renvoie 2 fois l'ArrayList pour la deuxième instanciation puis 3 fois pour le troisième new et ainsi de suite.
J'ai pensé à mettre un singleton pour être sûr que chaque nouvelle instanciation soit unique mais là je n'arrive pas à detruire la première.
tu ne passerais pas l'arrayList par copie par hasard ?
Tu dois passer par une reference sur l'arrayList plutot, pour etre sur que c la meme instance.
@+
Non l'ArrayList se remplie avec un DocumentListener quand des champs JTextField se remplie et tout est fait dans la classe elle même
bah alors je voispas , post nous ton code si tu veux... on regardera .
@+
Tu ferme la première fenêtre pour ensuite ouvrir la seconde?
Car sinon, tu crér peut-être un nouvel objet, mais es-tu certain que la frame possède bien une référence vers le nouvel objet, et qu'elle n'en conserve pas une vers l'ancien?
J'aimerais faire quelques remarques sur le sujet, libre à vous de les commenter biensur, je ne détiens pas le savoir absolu! 8)
La création d'un objet par appel à new() sur une même référence ne détruit pas l'objet étant référencé auparavant. Dans l'ordre, le nouvel objet est crée et la référence pointe vers ce nouvel objet, laissant l'autre objet en mémoire mais non référencé. Il sera candidat pour le GC uniquement si il n'est plus référencé par ailleurs et si le besoin de libérer de la mémoire se ressent.
Suite à un new() un nouvel espace mémoire est crée pour accueillir le nouvel objet. Cet espace est indépendant des autres, et il est impossible qu'il y ait "superposition" de mémoire, qui aurait pour effet par exemple de récupérer le champ String d'un autre objet. A mon avis tu dois avoir un "problème" au niveau de la création de l'objet, dans le constructeur peut-être..
Le GC se débrouille très bien sans avoir à passer des objets explicitement à null. Ca peut même nuir aux performances du programme, car le fait d'initialiser un objet à null est déjà une opération qui place l'objet dans un état "d'utilisation". Plutôt, pour optimiser les performances mémoire, il faut avoir une bonne notion de la portée des objets qu'on utilise, une bonne utilisation des attributs privates et publics ainsi que des constantes déclarées en final. Une bonne analyse à ce niveau là est la seule technique viable pour améliorer la performance mémoire de vos applications Java.
Il y a un système de cache il me semble sur les IHM. Il faut explicitement rappeller le rafraichissement pour que les données soient mises à jour avec les vraies valeurs, consulter l'API pour cette information, je ne l'ai pas sous le coude désolé.
K
PS : je n'avais pas remarqué que ce poste datait de 2003![]()
Partager