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

API standards et tierces Java Discussion :

Comment prévoir le passage du ramasse miettes ?


Sujet :

API standards et tierces Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2011
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2011
    Messages : 139
    Par défaut Comment prévoir le passage du ramasse miettes ?
    Salut

    Voila j'ai un programme tous simple pour utilisation de l'api rmi et j'ai besoin de prevoir le passge du ramasse miettes au bout de 10ms, ensuite 1ms avec affichage d'un message indiquant son passage

    Comment faire ça svp ?

    Voici mes classes :

    HelloInterface.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import java.rmi.*;
    public interface HelloInterface extends Remote{
     
      /*methode imprimant un message prédéfini dans l'objet appelé*/
      public String sayHello() throws RemoteException;
     
    }
    HelloImpl.java

    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
    import java.rmi.*;
    import java.rmi.server.*;
     
    public class HelloImpl extends UnicastRemoteObject implements HelloInterface{
     
      private String message;
      /*Le constructeur*/
      public HelloImpl(String s) throws RemoteException{
      super();
      // appelé automatiquement pour que l'OD puisse accepter les requetes
      message = s;}
      /*implementation de la méthode*/
      public String sayHello() throws RemoteException{
      return message;
      }
     
    }
    HelloServer.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import java.rmi.*;
    public class HelloServer{
     public static void main(String[] args){
      try{
       /*creer une instance de classe Hello et l'enregistrer dans le serveur de noms */
       Naming.rebind("Hello1",new HelloImpl("Hello World!"));
       System.out.println("Serveur pret:");
      }catch (Exception e){
       System.out.println("Erreur serveur:" +e);      
      }
     }
    }
    HelloClient.java

    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
    import java.rmi.*;
     
    public class HelloClient {
     
    	public static void main(String[] args){
    	try{	
    		/*cherche reference objet distant*/
    		HelloInterface hello = (HelloInterface)Naming.lookup("rmi://localhost/Hello1");
    		/*appel de method a distance*/
    		System.out.println(hello.sayHello());
    	}catch (Exception e){
         System.out.println("Erreur client:" +e);      
    	}
      }
    }
    Cordialement

  2. #2
    Membre émérite Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Par défaut
    Je ne connais aucun moyen de prévoir le passage du GC, mais par simple curiosité, ça sert à quoi ? En plus tu veux non seulement le prévoir, mais le provoquer toutes les 10ms ?! Ca semble très cher ! Pour quoi vouloir faire ça ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 96
    Par défaut
    Bonjour,

    avec la JVM standard il n'est pas possible de provoquer le passage de GC. Par contre tu peux voir quand un objet est détruit en utilisant sa méthode "finalize".


    S. Combes

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Euh, on peut toujours provoquer le passage du ramasse-miettes avec System.gc();
    Mais même s'il passe, ça ne veut pas forcément dire qu'il fait effectivement quelque chose. Ça dépend s'il y a quelque chose à ramasser pour sa stratégie.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 96
    Par défaut
    Bonjour,

    System.gc() demande le passage du GC mais ne le garanti pas : http://java.developpez.com/faq/java/...bage_collector

    J'ai aussi trouvé ce sujet : http://www.developpez.net/forums/d62...ode-system-gc/
    Je ne sais pas si la mise en garde de adiGuba est toujours d'actualité mais il vaut peut être mieux s'en assurer

    S. Combes

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bien sûr qu'elle est d'actualité.

    Invoquer le ramasse-miettes c'est pas rien, et étant donné qu'il est pas super clair s'il va faire quelque chose ou pas, au final c'est chercher les ennuis.

    On peut appeler le ramasse-miettes. Mais :
    - Ça n'avance à rien,
    - C'est chercher les ennuis,
    - Pas besoin. Tout marche très bien sans le faire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par stephane.combes Voir le message
    J'ai aussi trouvé ce sujet : http://www.developpez.net/forums/d62...ode-system-gc/
    Je ne sais pas si la mise en garde de adiGuba est toujours d'actualité mais il vaut peut être mieux s'en assurer
    La remarque est toujours d'actualité...

    S'il n'est pas ignoré, l'appel de System.gc() va générer une full-collection. C'est à dire que le GC va tout faire pour libérer un maximum de mémoire, ce qui est très couteux en temps...

    Mais c'est surtout inutile dans la plupart des cas !
    Bref on va surcharger le GC pour rien (en cas de besoin, le GC peut très bien faire une full-collection sans qu'on ne le lui demande).



    A noter également qu'il est préférable d'éviter de redéfinir finalize() pour rien, ca cela implique une libération moins rapide (après avoir exécuté finalize(), le GC doit s'assurer que la référence soit toujours inaccessible).




    Maintenant, il faudrait plus de détail quand au besoin exact qu'il y a derrière tout cela...



    a++

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/12/2006, 21h31
  2. [C#] Comment implémenter le passage d'un fichier excell à un DataSet ?
    Par Kajinshirha dans le forum Accès aux données
    Réponses: 2
    Dernier message: 24/08/2006, 14h54
  3. Réponses: 20
    Dernier message: 23/09/2005, 13h50
  4. Réponses: 2
    Dernier message: 27/06/2005, 11h41

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