IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Méthode Finalize et problème de conception


Sujet :

Langage Java

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 50
    Points : 70
    Points
    70
    Par défaut Méthode Finalize et problème de conception
    Ma question porte sur le fonctionnement de finalize. A priori la méthode est appelé par le garbage collector sur destruction d'un objet.

    Mais sur arrêt de la jvm elle même, la méthode n'est pas appelée ? Quelqu'un peut confirmer ?

    Le problème que l'on rencontre, c'est que l'on souhaite sauvegarder un contexte sur arrêt de l'application. Comment faire si on ne peut pas utiliser cette méthode ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    C'est finalize avec un z, peut-être avez-vous la même erreur dans votre code?

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 50
    Points : 70
    Points
    70
    Par défaut
    En fait c'est une erreur de retranscription sur le forum

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
     
    public class TestGC {
     
        public void finalize() {
            System.out.println("Destruction de l'objet");
        }
     
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String strCommande;
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
     
            try {
                System.out.println("-----------------------");
                System.out.println("TestGC par NIB");
                System.out.println("25/05/2005");
                System.out.println("-----------------------");
                System.out.print("?>");
                while ((strCommande = in.readLine()) != null){
                    long timeNano = 0;
                    if (strCommande.equalsIgnoreCase("?")){
                        System.out.println("Commande : lance, quit, gc");
                    }
                    else if (strCommande.equalsIgnoreCase("lance")){
                        int i = 0;
                        TestGC test;
                        while (++i < 30) {
                            test = new TestGC();
                        }
                    }
                    else if (strCommande.equalsIgnoreCase("quit")){
                        System.out.println("Fermeture de l'application");
                        System.exit(0);
                    }
                    else if ((strCommande.equalsIgnoreCase("gc"))){
                        timeNano = System.nanoTime();
                        System.out.println("Lancement garbage collector");
                        System.gc();
                        System.out.println("Fin garbage collector");
                        System.out.println("Temps passé à l'execution : " + 
                                ((System.nanoTime() - timeNano)/1000000) + "ms");
     
                    }
                    else {
                        System.out.println("Commande non supportée");
                    }
                    System.out.print("?>");
                    System.out.flush();
                }
            }
            catch (IOException e) {}
        }
     
    }
    Voilà le petit programme de test. On exécute.
    On fait lance puis gc on voit bien que les objets sont détruits.
    On fait lance puis on provoque l'arrêt de la jvm, il ne se passe rien.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par phryos
    Ma question porte sur le fonctionnement de finalise. A priori la méthode est appelé par le garbage collector sur destruction d'un objet.
    Oui

    Citation Envoyé par phryos
    Mais sur arrêt de la jvm elle même, la méthode n'est pas appelée ? Quelqu'un peut confirmer ?
    En effet ! Il était possible de forcer cela avec la méthode Runtime.runFinalizersOnExit() mais ce n'est plus possible car cela pose des problèmes en environnement multithread et peut engendrer des erreurs innatendu...

    Citation Envoyé par phryos
    Le problème que l'on rencontre, c'est que l'on souhaite sauvegarder un contexte sur arrêt de l'application. Comment faire si on ne peut pas utiliser cette méthode ?
    La méthode finalize() n'est pas faite pour cela. Elle doit se limiter à libérer proprement la mémoire et les ressources (si cela n'a pas déjà été fait).

    Dans ton cas, je pense que les ShutdownHook sont plus approprié : Runtime.addShutdownHook()

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Runtime.getRuntime().addShutdownHook(new Thread() {
                @Override
                public void run() {
                    // ...
                }
            });
    a++

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 50
    Points : 70
    Points
    70
    Par défaut
    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 08/06/2012, 09h22
  2. [VB6][UserControl et OCX]Problème de conception
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/01/2006, 22h37
  3. Petit problème de conception sur access
    Par coooookinette dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/12/2005, 18h24
  4. Gestion des départements problème de conception
    Par snoopy69 dans le forum Modélisation
    Réponses: 7
    Dernier message: 11/10/2005, 13h08
  5. Problème de conceptions de tables
    Par dtavan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/05/2004, 23h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo