OVH Cloud OVH Cloud

fermeture de tomcat et méthodes finalize()

5 réponses
Avatar
Joe
hello,
il me semble avoir des problèmes avec finalize() lors de la fermeture
d'un tomcat (style shutdown.sh) : cette méthode ne semble pas appelée !

avez vous constaté le meme problème ? peut on le résoudre ?

dans un autre registre, mais toujours avec tomcat:
je me suis aperçu qu'un simple appel dans une classe a
System.exit()... arretait tout simplement tomcat ! y a t'il moyen de
bloquer ceci ?

merci d'avance !
joe

5 réponses

Avatar
jerome moliere
Joe wrote:
hello,
il me semble avoir des problèmes avec finalize() lors de la fermeture
d'un tomcat (style shutdown.sh) : cette méthode ne semble pas appelée !

avez vous constaté le meme problème ? peut on le résoudre ?

oui , tres simplement, NE JAMAIS RIEN CODER dans la methode

finalize().... comme cela zip, fini les ennuis... dans le contexte J2EE
ou en dehors cette methode est dangereuse...

dans un autre registre, mais toujours avec tomcat:
je me suis aperçu qu'un simple appel dans une classe a
System.exit()... arretait tout simplement tomcat ! y a t'il moyen de
bloquer ceci ?

tiens donc ? cela me parait etonnant, mais je dois dire que je n'ai

jamais essaye !! :)

merci d'avance !
joe




Avatar
Joe
On Mon, 13 Oct 2003 20:12:57 +0200, jerome moliere wrote:

Joe wrote:
hello,
il me semble avoir des problèmes avec finalize() lors de la fermeture
d'un tomcat (style shutdown.sh) : cette méthode ne semble pas appelée !

avez vous constaté le meme problème ? peut on le résoudre ?

oui , tres simplement, NE JAMAIS RIEN CODER dans la methode

finalize().... comme cela zip, fini les ennuis... dans le contexte J2EE
ou en dehors cette methode est dangereuse...

effectivement, mais dans ce cas comment effectuer un traitement (style

fermer proprement des Connection en cas d'arret de tomcat ?)

dans un autre registre, mais toujours avec tomcat:
je me suis aperçu qu'un simple appel dans une classe a
System.exit()... arretait tout simplement tomcat ! y a t'il moyen de
bloquer ceci ?

tiens donc ? cela me parait etonnant, mais je dois dire que je n'ai

jamais essaye !! :)

oui, j'ai trouvé ca assez hallucinant... mais ca marche !

si c'est impossible a bloquer, je vois mal comment fournir une solution
d'hébergement public basée sur tomcat !


Avatar
Cédric Chabanois
Joe wrote:

hello,
il me semble avoir des problèmes avec finalize() lors de la fermeture
d'un tomcat (style shutdown.sh) : cette méthode ne semble pas appelée !

avez vous constaté le meme problème ? peut on le résoudre ?



oui , tres simplement, NE JAMAIS RIEN CODER dans la methode
finalize().... comme cela zip, fini les ennuis... dans le contexte J2EE
ou en dehors cette methode est dangereuse...


effectivement, mais dans ce cas comment effectuer un traitement (style
fermer proprement des Connection en cas d'arret de tomcat ?)



finalize est appelée par le GC avant de libérer l'objet. Donc on ne peut
pas prédire quand cette méthode va être appelée, cela dépend de la
JVM, de la mémoire disponible ...

Et les objets peuvent très bien ne pas être "garbage collectés". Lorsque
la JVM se termine, la mémoire est retournée en masse à l'OS, sans que
les objets ne soient "garbage collectés".
Enfin ca doit dépendre de la JVM mais c'est souvent comme ca.
Donc, comme le dit Jerome : RIEN dans le finalize. finalize n'est pas
l'équivalent du destructeur C++.

Si tu veux fermer correctement des connections, appelle une méthode pour
le faire.



dans un autre registre, mais toujours avec tomcat:
je me suis aperçu qu'un simple appel dans une classe a
System.exit()... arretait tout simplement tomcat ! y a t'il moyen de
bloquer ceci ?



tiens donc ? cela me parait etonnant, mais je dois dire que je n'ai
jamais essaye !! :)




Ouai très étrange. Cela se règle peut-être en paramétrant le security
manager :
http://jakarta.apache.org/tomcat/tomcat-4.0-doc/security-manager-howto.html

Cédric



Avatar
Manu
Joe wrote:
effectivement, mais dans ce cas comment effectuer un traitement (style
fermer proprement des Connection en cas d'arret de tomcat ?)


Tu peux mettre ton code dans la méthode destroy() d'une servlet
initialisée au démarrage de Tomcat.


--
Manu

Avatar
Erwan David
Cédric Chabanois écrivait :

finalize est appelée par le GC avant de libérer l'objet. Donc on ne
peut pas prédire quand cette méthode va être appelée, cela dépend de
la JVM, de la mémoire disponible ...

Et les objets peuvent très bien ne pas être "garbage
collectés". Lorsque la JVM se termine, la mémoire est retournée en
masse à l'OS, sans que les objets ne soient "garbage collectés".
Enfin ca doit dépendre de la JVM mais c'est souvent comme ca.
Donc, comme le dit Jerome : RIEN dans le finalize. finalize n'est pas
l'équivalent du destructeur C++.

Si tu veux fermer correctement des connections, appelle une méthode
pour le faire.


On peut définir un thread qui sera appelé à la fermeture du système aussi.