Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2726 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] finalize jamais appelée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JAVA] finalize jamais appelée

n°332200
_gtm_
Posté le 13-03-2003 à 15:48:52  profilanswer
 

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 ?
 

mood
Publicité
Posté le 13-03-2003 à 15:48:52  profilanswer
 

n°332212
TBone
Pouet.
Posté le 13-03-2003 à 15:58:53  profilanswer
 

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.


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
n°332213
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 13-03-2003 à 16:00:42  profilanswer
 

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...

n°332220
nraynaud
lol
Posté le 13-03-2003 à 16:05:58  profilanswer
 

_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
n°332222
_gtm_
Posté le 13-03-2003 à 16:08:51  profilanswer
 

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

n°332225
TBone
Pouet.
Posté le 13-03-2003 à 16:18:21  profilanswer
 

_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.


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
n°332229
nraynaud
lol
Posté le 13-03-2003 à 16:20:27  profilanswer
 

_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).

n°332255
benou
Posté le 13-03-2003 à 16:54:58  profilanswer
 

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 :/

n°332267
_gtm_
Posté le 13-03-2003 à 17:01:52  profilanswer
 

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:

n°332270
nraynaud
lol
Posté le 13-03-2003 à 17:03:39  profilanswer
 

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.

mood
Publicité
Posté le 13-03-2003 à 17:03:39  profilanswer
 

n°332273
nraynaud
lol
Posté le 13-03-2003 à 17:07:09  profilanswer
 

_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).

n°332275
_gtm_
Posté le 13-03-2003 à 17:08:10  profilanswer
 

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

n°332281
nraynaud
lol
Posté le 13-03-2003 à 17:15:46  profilanswer
 

_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 ?¿?

n°332285
benou
Posté le 13-03-2003 à 17:17:07  profilanswer
 

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

n°332289
nraynaud
lol
Posté le 13-03-2003 à 17:23:03  profilanswer
 


 
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
n°332294
benou
Posté le 13-03-2003 à 17:25:49  profilanswer
 

nraynaud a écrit :


c'est plus rapide de demander que de chercher.


 :sarcastic:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] finalize jamais appelée

 

Sujets relatifs
[Java] Session à null à cause d'un proxylien java <-> c++
[java][newbie]savoir si le txtfield est bien un int[résolu]faire une connexion sécurisée (https) depuis un prog java ?
detecter si le navigateur à activer les script java[Java Général] fonction zoom
php/java cookie[JAVA] Pb d'interfaçage avec SICStus Prolog sous XP
[biblio]Un bon bouquin sur les webservices et java?[java] imprimer 3 panels en 1 fois
Plus de sujets relatifs à : [JAVA] finalize jamais appelée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR