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

Java Discussion :

Problème avec la fermeture de la JVM


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 463
    Points : 114
    Points
    114
    Par défaut Problème avec la fermeture de la JVM
    Salut !


    J'ai un problème assez embêtant avec mon appli.
    Entre le moment où l'appli se ferme et celui où la jvm se coupe (avec libération des ressources), il se passe environ 1 minute (55 '' pour etre précis).

    Après recherche, j'ai constaté que le problème se situait dans une classe qui hérite de UnicastRemoteObject. Mais je sais pas si c'est lié.

    Pourtant, j'ai appelé la méthode unexportObject sur tous les objets que j'ai instancié dans cette classe ...


    Auriez-vous une idée ?

  2. #2
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Salut,

    Tu ne nous donnes pas assez (en fait pas du tout) de ton code source pour que l'on t'aide d'avantage. N'étant pas devin ou je ne sais quoi, je ne peux pas deviner d'où viens l'erreur. J'ai compris ton problème, bien que les termes UnicastRemoteObject et unexportObject me soit inconnus. Je vais faire une recherche, toi, donnes nous ton code en n'oubliant pas d'utiliser la balise [code] (disponible avec le bouton # dans l'éditeur de message).

    Merci .

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 463
    Points : 114
    Points
    114
    Par défaut
    J'ai pas mis le code parce que c'est beaucoup trop gros... L'architecture est vraiment trop vaste et les données circulent dans "tous les sens".

    Mais bon, en gros, si je dois résumer, ça donne ceci :


    Le code de la classe qui appelle la méthode "problématique" :

    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
     
    public class TraderSPTableModel extends AbstractTableModel{
     
    	.....
     
    	private ArrayList<SPTrader> content = null;
     
    	public TraderSPTableModel() {
    		SPTrader spt=null;
    		try {
    			spt = new SPTrader();
    		} catch (RemoteException e2) {			
    			e2.printStackTrace();
    		}
    		content = new ArrayList<SPTrader>();
    		Iterator<SPTrader> iter = null;
    		try {
    			iter = spt.createSPTrader(1);
    		} catch (RemoteException e1) {			
    			e1.printStackTrace();
    		} catch (TitreNotExistException e1) {			
    			e1.printStackTrace();
    		} catch (SicavNotExistException e1) {			
    			e1.printStackTrace();
    		} catch (PretNotExistException e1) {			
    			e1.printStackTrace();
    		}
    		try {
    			if (! iter.hasNext())
    				throw new SPNotExistException();
    			else {
    				while(iter.hasNext()) {
    					SPTrader sptrader = iter.next();	
    					addRow(sptrader);		
    					try {
    						java.rmi.server.UnicastRemoteObject.unexportObject(sptrader, true);
    					} catch (NoSuchObjectException e) {						
    						e.printStackTrace();
    					}					
    				}	
    			}	
    		}
    		catch(SPNotExistException e) {
    			System.out.println("SP inexistant - val = " + e.getMessage());
    		}
    		try {
    			java.rmi.server.UnicastRemoteObject.unexportObject(spt, true);
    		} catch (NoSuchObjectException e) {
    			e.printStackTrace();
    		}
    	}
     
            .....
     
    }

    Le code de la classe où se trouve la méthode "problématique" (createSPTrader) :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    public class SPTrader extends UnicastRemoteObject implements SPTraderInterface{
     
    	.....
     
    	public static ArrayList<Titre> listeTitreParSicav(int idSicav) throws RemoteException, SicavNotExistException {
    		Iterator<TitreDTO> iter = Factory.getInstance().getTitreDAO().rechercherBySicav(idSicav);
    		ArrayList<Titre> liste = new ArrayList<Titre>();		
    		while(iter.hasNext()) {
    			TitreDTO titreDTO = iter.next();
    			liste.add(new Titre(titreDTO));
    		}
    		return liste;
    	}
     
    	public static ArrayList listeTitre() throws RemoteException {
    		Iterator<TitreDTO> iter = Factory.getInstance().getTitreDAO().liste();
    		ArrayList<Titre> liste = new ArrayList<Titre>();		
    		while(iter.hasNext()) {
    			TitreDTO titreDTO = iter.next();
    			liste.add(new Titre(titreDTO));
    		}
    		return liste;
    	}
     
    	private static ArrayList<Titre> recherche(int isin,int idSicav) throws TitreNotExistException, RemoteException,SicavNotExistException{
    		ArrayList<Titre> ar = new ArrayList<Titre>();
    		Iterator it = Factory.getInstance().getTitreDAO().rechercherByTitle(isin);
    		while (it.hasNext()) {
    			Titre t= new Titre((TitreDTO)it.next());
    			ar.add(t);
    		}		
    		ArrayList<Titre> ar2;
    		ar2 = SPTrader.listeTitreParSicav(idSicav);
    		ArrayList<Titre> ar3 = new ArrayList<Titre>();
    		for (int i=0;i<ar.size();i++)
    		{
    			for (int j=0;j<ar2.size();j++)
    			{
    				if (ar.get(i).getIdTitre()==ar2.get(j).getIdTitre())
    				{ar3.add(ar.get(i));}
     
    			}
    		}
    		return ar3;			
    	}
     
    	private static int EnPret(int id, int idSicav) throws TitreNotExistException, PretNotExistException{
    		Iterator<PretDTO> it = Factory.getInstance().getPretDAO().searchByIsinCodeAndSicav(id, idSicav);
    		int x=0;
    		while (it.hasNext()) {
    			Pret p = new Pret(it.next());
    			x+= p.getQuantity();
    		}
    		return x;
    	}
     
    	public Iterator<SPTrader> createSPTrader(int idSicav) throws RemoteException, TitreNotExistException, SicavNotExistException, PretNotExistException {
    		ArrayList<SPTrader> arsptrader = new ArrayList<SPTrader>();
    		ArrayList<Titre> artitre;
    		String nom="";
    		int Qt = 0;
    		int qtEnPret=0;
    		int qtDispo=0;
    		int QtJ1=0;
    		int QtJ2=0;
    		int QtJ3=0;
    		int isin;
    		boolean ok=true;
    		for (int i = 0;i<SPTrader.listeTitreParSicav(idSicav).size();i++) {
    			Titre t = new Titre((Titre)SPTrader.listeTitreParSicav(idSicav).get(i));
    			artitre = SPTrader.recherche(t.getIsin(),idSicav);
    			if (arsptrader.size()>0) {
    				for (int x = 0;x<arsptrader.size()&& ok;x++) {
    					if (t.getIsin()!=arsptrader.get(x).getIsin()) {
    						nom =t.getNom();
    						isin = t.getIsin();
    						int z=0;
    						Qt = 0;
    						qtEnPret=0;
    						qtDispo=0;
    						QtJ1=0;
    						QtJ2=0;
    						QtJ3=0;
    						while (z<artitre.size()) {
    							Titre t1 = new Titre(artitre.get(z));
    							Qt += t1.getQt();
    							qtEnPret+=EnPret(t1.getIdTitre(),idSicav);
    							qtDispo += t1.getQt()-qtEnPret;
    							QtJ1 = qtDispo;
    							QtJ2=qtDispo;
    							QtJ3=qtDispo;
    							z++;
    						}
    						SPTrader sptrader = new SPTrader(nom,Qt,qtEnPret,qtDispo,QtJ1,QtJ2,QtJ3,isin);						
    						arsptrader.add(sptrader);				
    					}
    					else ok=false;
    				}
    			}
    			else{
    				nom =t.getNom();
    				isin = t.getIsin();
    				int z=0;
    				Qt = 0;
    				qtEnPret=0;
    				qtDispo=0;
    				QtJ1=0;
    				QtJ2=0;
    				QtJ3=0;
    				while (z<artitre.size()) {
    					Titre t1 = new Titre(artitre.get(z));
    					Qt += t1.getQt();
    					qtEnPret+=EnPret(t1.getIdTitre(),idSicav);
    					qtDispo = Qt-qtEnPret;
    					QtJ1 = qtDispo;
    					QtJ2=qtDispo;
    					QtJ3=qtDispo;
    					z++;
    				}
    				SPTrader sptrader = new SPTrader(nom,Qt,qtEnPret,qtDispo,QtJ1,QtJ2,QtJ3,isin);				
    				arsptrader.add(sptrader);			
    			}
    		}
    		return arsptrader.iterator();
    	}	
    }

    Voilà

  4. #4
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Citation Envoyé par Mike888
    Après recherche, j'ai constaté que le problème se situait dans une classe qui hérite de UnicastRemoteObject. Mais je sais pas si c'est lié.
    Pourrais tu nous donner le lien du document où tu as trouvé que UnicastRemoteObject pouvait être le responsable de ton problème ?

    Et le seul moyen d'être fixé, c'est de retirer l'utilisation de la classe SPTrader de ton code, et de voir si le problème persiste.

    Merci

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 463
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Janitrix
    Pourrais tu nous donner le lien du document où tu as trouvé que UnicastRemoteObject pouvait être le responsable de ton problème ?
    Olalah, je ne sais plus; j'ai tellement fouiné sur le net... Et puis c'est une somme de renseignements qui me fait pencher vers cette hypothèse. D'ailleurs, je ne peux pas prétendre que c'est ça à 100%


    Citation Envoyé par Janitrix
    Et le seul moyen d'être fixé, c'est de retirer l'utilisation de la classe SPTrader de ton code, et de voir si le problème persiste.
    Merci, mais j'ai déjà testé ça depuis longtemps !

    Le problème survient dès que j'utilise la méthode createSPTrader.

  6. #6
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Bon d'accord, tu as trouvé que le problème vient de la méthode createSPTrader, mais il y a plein de truc dans cette méthode. Essai donc de faire quelques test dans cette même méthode pour déterminer exactement où est le problème. Cette méthode me semble complexe, il y a des boucles et appelles à d'autres méthodes, ça ressemble un peu à une usine à gaz. Bonne débug

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 463
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Janitrix
    Bon d'accord, tu as trouvé que le problème vient de la méthode createSPTrader, mais il y a plein de truc dans cette méthode. Essai donc de faire quelques test dans cette même méthode pour déterminer exactement où est le problème. Cette méthode me semble complexe, il y a des boucles et appelles à d'autres méthodes, ça ressemble un peu à une usine à gaz. Bonne débug
    Le problème, c'est qu'on fait le projet à 4, et que cette méthode est dans la couche fonctionnelle (qui n'est pas ma partie). Ce n'est donc pas moi qui l'ai écrite.
    Je sais ce qu'elle fait en gros mais pas dans les détails; et je suis d'acc pour dire que c'est bizarrement codé (haut potentiel de bug). Et je ne vais pas m'amuser à parcourir toutes les boucles sinon je suis encore là dans 2 H (et j'ai du pain sur la planche).
    La personne concernée n'a pas l'air de s'en préoccuper outre mesure (du bug), vu qu'au final, le prog se termine (lentement mais surement). Mais moi j'ai horreur des choses mal faites donc je veux savoir ...


    Donc, je repose ma question : Qu'est-ce qui peut provoquer un ralentissement dans la fermeture de la JVM ? Est-ce qu'il pourrait y avoir un lien avec le RMI ?

  8. #8
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Oui je pense qu'il peut y avoir un lien avec le RMI : une connexion mal fermé que la JVM doit interrompre, cela peut potentiellement prendre du temps, personnellement, je pense que le problème vient de là : la JVM doit s'occuper de couper les connexions RMI. Si la JVM doit envoyer des messages au poste distant pour confirmer la fin de la connexion, cela peut expliquer le temps d'attente avant la fin de ton programme.

    Il faut être organiser en équipe, si ton équipier chargé de cette partie ne s'en préoccupe pas, à toi de lui rappeler et en cas de prendre les mesures nécessaires.

    Je ne suis pas un spécialiste du RMI, mais la logique de Java est simple, et une connexion non fermé est souvent cause de problème.

    Bonne chance, et n'hésite pas à "bouger" ton coéquipier s'il ne prend pas conscience du problème

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 463
    Points : 114
    Points
    114
    Par défaut
    Bon, j'ai encore trifouillé dans les entrailles de Google.
    Apparement, il s'agit d'un problème connu...

    En gros, il faut attendre que le Garbage Collector passe par là; mais c'est plus complexe que ça...

    Si vous voulez en savoir plus : Google ->

    - reaper
    - unexportObject
    - rmi
    - gcd
    - delay
    - jvm
    - shutdown
    - ...

Discussions similaires

  1. [Toutes versions] Problème avec croix fermeture fichier
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 09/11/2010, 18h40
  2. problèmes avec les différentes version de JVM & JDK
    Par Jcpan dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 02/01/2009, 18h01
  3. Problème avec la version de la JVM
    Par demcoul dans le forum Langage
    Réponses: 2
    Dernier message: 01/12/2007, 10h38
  4. problème avec la fermeture d'une frame
    Par kaninama dans le forum AWT/Swing
    Réponses: 15
    Dernier message: 19/03/2007, 16h46
  5. problème avec JVM
    Par ulysse031 dans le forum JBuilder
    Réponses: 1
    Dernier message: 16/03/2007, 17h36

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