[JAVA] finalize jamais appelée

finalize jamais appelée [JAVA] - Java - Programmation

Marsh Posté le 13-03-2003 à 15:48:52    

J'ai une classe apparemment toute normale (public, pas abstraite, n'implémente pas de trucs bizarres), et j'ai voulu surcharger finalize pour afficher des informations de débogage à la fin. Mais voilà, ça n'entre jamais dans finalize. Je suis sûr qu'elle a été créee, car elle passe par un point d'arrêt que j'ai mis.
 

Code :
  1. public class MaClasse
  2. {
  3.   ...
  4. protected void finalize () throws java.lang.Throwable {
  5.         System.out.println("bouh!" );
  6.         if (debug != null) {           
  7.             System.out.println(debug.toString());
  8.         }
  9.         super.finalize();
  10.     }
  11. }


 
Elle est appelée comme ça:
 

Code :
  1. MaClasse c = new MaClasse();
  2. uneMethode(c);


 
Et n'est stockée dans aucune variable.
 
Le problème en soi n'est pas trop gênant dans mon cas car je peux le contourner facilement, mais c quand même bizarre...
 
Quelqu'un a une idée ?
 

Reply

Marsh Posté le 13-03-2003 à 15:48:52   

Reply

Marsh Posté le 13-03-2003 à 15:58:53    

j'ai eu le même coup il y a 2-3 jours... je prenais finalize() pour  un destructeur à la C++...
 
il faut virer tout référence vers ton objet ET passer un coup de garbage collector pour que finalize soit exécuté... mais pas immédiatement...
 
sinon, j'ai croisé une note dans la doc accompagnant le JDK sur une option de la JVM mais je ne l'ai pas retenue.


---------------
A straight line is a special case of a curve. It's a curve which is uncurved. -- Susskind.
Reply

Marsh Posté le 13-03-2003 à 16:00:42    

TBone a écrit :

j'ai eu le même coup il y a 2-3 jours... je prenais finalize() pour  un destructeur à la C++...
 
il faut virer tout référence vers ton objet ET passer un coup de garbage collector pour que finalize soit exécuté... mais pas immédiatement...
 
sinon, j'ai croisé une note dans la doc accompagnant le JDK sur une option de la JVM mais je ne l'ai pas retenue.


 
pareil, il doir rester une référence à ton objet ce qu'il l'empêche d'être traité par le gc...

Reply

Marsh Posté le 13-03-2003 à 16:05:58    

_gtm_ a écrit :

J'ai une classe apparemment toute normale (public, pas abstraite, n'implémente pas de trucs bizarres), et j'ai voulu surcharger finalize pour afficher des informations de débogage à la fin. Mais voilà, ça n'entre jamais dans finalize. Je suis sûr qu'elle a été créee, car elle passe par un point d'arrêt que j'ai mis.
 
Et n'est stockée dans aucune variable.
 
Le problème en soi n'est pas trop gênant dans mon cas car je peux le contourner facilement, mais c quand même bizarre...
 
Quelqu'un a une idée ?
 
 


Déjà, tu n'as aucune garantie que ça sera appellé : http://www.mantrotech.com/technolo [...] notes1.asp
 
Ensuite, il peut te rester des références desssus.
Enfin, si tu fous pas la pression sur le GC, il va pas GCiser.
 
edit : en éditant (pour virer le code de la citation), je viens de m'appercevoir que tu avait foutu au moins 2 références sur la pile.


Message édité par nraynaud le 13-03-2003 à 16:08:40
Reply

Marsh Posté le 13-03-2003 à 16:08:51    

Je n'ai jamais alloué mon objet à un attribut d'un autre objet, donc il ne devrait pas y avoir de références. Je l'alloue seulement à des variables locales dans les methodes, mais ça disparait quand la methode est terminée normalement.
 
Je veux bien qu'il ne l'execute pas tout de suite, mais quand le programme se termine, le GC devrait appeler les methodes finalize de tous les objets qui sont encore là non ?
 
Sinon, c'est peut-être la note de TBone qui fournira la solution

Reply

Marsh Posté le 13-03-2003 à 16:18:21    

_gtm_ a écrit :


Je veux bien qu'il ne l'execute pas tout de suite, mais quand le programme se termine, le GC devrait appeler les methodes finalize de tous les objets qui sont encore là non ?


non, car il ne réagit pas comme les destructeurs C++

_gtm_ a écrit :


Sinon, c'est peut-être la note de TBone qui fournira la solution


bah dans la doc à côté de la javadoc... c'est dans les zesplications des options de la JVM si je ne me trompe.


---------------
A straight line is a special case of a curve. It's a curve which is uncurved. -- Susskind.
Reply

Marsh Posté le 13-03-2003 à 16:20:27    

_gtm_ a écrit :

Je n'ai jamais alloué mon objet à un attribut d'un autre objet, donc il ne devrait pas y avoir de références. Je l'alloue seulement à des variables locales dans les methodes, mais ça disparait quand la methode est terminée normalement.
 
Je veux bien qu'il ne l'execute pas tout de suite, mais quand le programme se termine, le GC devrait appeler les methodes finalize de tous les objets qui sont encore là non ?
 
Sinon, c'est peut-être la note de TBone qui fournira la solution


 
je rajoute un peu de notation :

Code :
  1. {
  2. MaClasse c = new MaClasse();
  3. uneMethode(c);
  4. }

 
 
pas avant que ce bloc là ne soit fini, il y a 2 réferences à ton instance sur la pile durant l'exécution de uneMethode, quand elle se termine, il en reste une (la variable).
 

Code :
  1. {
  2. uneMethode(new MaClasse());
  3. }

 
 
dans ce bloc là, le gc peut passer après le retour de la méthode, mais pas s'il n'a pas de raison de le faire (un coup de pression lors d'une allocation ou une demande explicite).

Reply

Marsh Posté le 13-03-2003 à 16:54:58    

finalize est appelée au moment du GC. mais le GC, en Java, il passe quand il veut ... même quand tu lui demande de passer, il passe si il a envie ... y a pas de garantie !
 
si tu veux vérifier, t'as qu'à faire ca :  
 

Code :
  1. for (int i = i; i < 100000; i++) {
  2.    new MaClasse();
  3. }

 
et encore, ca pourrait très bien ne pas garbage collecter :/

Reply

Marsh Posté le 13-03-2003 à 17:01:52    

Ok, ben je fais autrement...
 
Sinon, le programmeur du jdk qui fournit une méthode qu'on peut surcharger mais on ne sait pas si et quand elle sera appelée, il avait quoi derrière la tête ? :crazy:

Reply

Marsh Posté le 13-03-2003 à 17:03:39    

benou a écrit :

finalize est appelée au moment du GC. mais le GC, en Java, il passe quand il veut ... même quand tu lui demande de passer, il passe si il a envie ... y a pas de garantie !
 
si tu veux vérifier, t'as qu'à faire ca :  
 

Code :
  1. for (int i = i; i < 100000; i++) {
  2.    new MaClasse();
  3. }

 
et encore, ca pourrait très bien ne pas garbage collecter :/


 
 
Faut que MaClasse ait une tonne de variables d'instance, et réduire le seuil du GC, et ça devrait marcher.

Reply

Marsh Posté le 13-03-2003 à 17:03:39   

Reply

Marsh Posté le 13-03-2003 à 17:07:09    

_gtm_ a écrit :

Ok, ben je fais autrement...
 
Sinon, le programmeur du jdk qui fournit une méthode qu'on peut surcharger mais on ne sait pas si et quand elle sera appelée, il avait quoi derrière la tête ? :crazy:


 
L'idée qu'elle ne s'utilise que dans des cas super-précis et rares, j'ai même pas d'exemple en tête.
 
Si tu veux jouer avec le GC, les références faibles me parraissent plus intéressantes (tu peux par ex. faire un cache de taille varible dont la taille augmente s'il y a de la mémoire dispo et qui diminue si la pression augmente).

Reply

Marsh Posté le 13-03-2003 à 17:08:10    

Coincidence ?
 
Y'a justement un article de JavaWorld sur les nouveaux algorithmes de GC dans java 1.4.1

Reply

Marsh Posté le 13-03-2003 à 17:15:46    

_gtm_ a écrit :

Coincidence ?
 
Y'a justement un article de JavaWorld sur les nouveaux algorithmes de GC dans java 1.4.1


 
T'as une URL ?¿?

Reply

Marsh Posté le 13-03-2003 à 17:17:07    

t'as essayé http://www.javaworld.com ?  :sarcastic:

Reply

Marsh Posté le 13-03-2003 à 17:23:03    


 
Nan parce qu'au fin fond de l'Argentine, le net il est pas pareil qu'en France et vu la vitesse, c'est plus rapide de demander que de chercher.
 
edit : heu dire merci ne devrait pas m'arracher le gueule.
 
merci pour l'URL


Message édité par nraynaud le 13-03-2003 à 17:23:54
Reply

Marsh Posté le 13-03-2003 à 17:25:49    

nraynaud a écrit :


c'est plus rapide de demander que de chercher.


 :sarcastic:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed