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 :

Libération propre de la mémoire


Sujet :

Java

  1. #1
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut Libération propre de la mémoire
    Bonjour,

    J'ai un programme Java qui fonctionne bien qui traite des fichiers reçus.

    On me demande de ne plus le lancer au coup par coup lors de la réception de ces fichiers, mais de le laisser boucler continuellement.

    Or j'ai un problème d'occupation mémoire qui finit par exploser dès que j'attends les quelques centaines de fichiers.

    J'ai donc commencé à réviser les sources en prenant soin de libérer les ressousces proprement, comme expliqué dans la FAQ Java (http://java.developpez.com/faq/java/...ererRessources).

    J'ai commencé par la partie JDBC.

    Voici ce que j'ai fait :
    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
     
    public AppEmiMdtR findByApplication(long appId, boolean recurse) throws DaoException {
    	log.trace("findByApplication(appId=" + appId + ", recurse=" + recurse + ")");
     
    	AppEmiMdtR obj = new AppEmiMdtR();
    	try {
    		// 1 - Création de la ressource (IPreparedStatement)
    		IPreparedStatement ps = dbHandler.prepareStatement("app_emi_mdt_r.select.by.app_id");
    		try {
    			// 2 - Utilisation de la ressource (IPreparedStatement)
    			ps.setInt(1, 1); // ate_actif
    			ps.setInt(2, 0); // ate_supprime
    			ps.setLong(3, appId);
    			// 1 - Création de la ressource (ResultSet)
    			ResultSet rs = ps.executeQuery();
    			try {
    				// 2 - Utilisation de la ressource (ResultSet)
    				if (rs.next()) {
    					obj = mapAppEmiMdtR(rs, recurse);
    				}
    			} finally {
    				// 3 - Libération de la ressource (ResultSet)
    				DaoUtil.close(rs);
    			}
    		} finally {
    			// 3 - Libération de la ressource (IPreparedStatement)
    			DaoUtil.close(ps);
    		}
    	} catch (Exception e) {
    		log.error("Exception: " + e.getMessage(), e);
    		throw new DaoException("Exception: " + e.getMessage(), e);
    	}
    	return obj;
    }
    Quelqu'un peut-il me dire si c'est bien ça ?
    Y a-t-il un moyen simple de voir que tout est bien libéré ?

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    en plus de fermer tes statements, éventuellement, pense de temps en temps à fermer aussi ta connexion.

    Mis à part cela, il faut surtout chercher tes fuites mémoire dans les données que tu garde en mémoire:
    contenu de fichier (byte[]) qui resteraient en mémoire car toujours référencé quelque part, map stockée quelque part avec une liste de contenu qui grandis au fur et à mesure, etc.

    Des outils de profiling (comme celui fournis avec eclipse) pourraient t'indiquer directement où se situe la perte.

  3. #3
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Merci tchize_ pour ta réponse

    Citation Envoyé par tchize_ Voir le message
    en plus de fermer tes statements, éventuellement, pense de temps en temps à fermer aussi ta connexion.
    Pourquoi fermer de temps en temp la connexion base de données ?

    Citation Envoyé par tchize_ Voir le message
    Des outils de profiling (comme celui fournis avec eclipse) pourraient t'indiquer directement où se situe la perte.
    Je ne connais pas cet outil !
    Tu peux préciser stp ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si tu garde une seule connexion constamment ouverte:

    1) le serveur de BD pourrais t'éjecter la nuit ou le week-end parce que tu maintient cette connexion depuis trop longtemps / trop longtemps sans rien faire

    2) ça permet de t'assurer que tu n'a pas laissé de statement ouvert, de transaction en attente, de resultset en attente




    Pour le profiler, je ne peux que te dire de lire les docs existante. En gros ca sert à analyser ton application pendant qu'elle tourne pour en sortir des informations telles que où est consommée la mémoire, quels sont les point chaud (CPU) du code, etc.

  5. #5
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Merci encore tchize_ pour tes réponses.

    Comment déterminer la fréquence de coupure de la connexion à la base de données ?

    Concernant le profiler Eclipse, comment faire pour le trouver ?
    C'est dans un menu Eclipse ?

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    -> ben a priori, quand t'as fait un bloc d'opérations cohérentes (en fin de transaction donc) me semble une bonne idée. A voir en pratique comment ton applicaiton est construite et ce qu'elle fait

    -> http://www.eclipse.org/tptp/home/doc.../tptpindex.php

  7. #7
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    -> ben a priori, quand t'as fait un bloc d'opérations cohérentes (en fin de transaction donc) me semble une bonne idée. A voir en pratique comment ton applicaiton est construite et ce qu'elle fait
    Oui mais ça doit couter de fermer puis ouvrir la connexion à la base à chaque fois

    Oups!
    Pas de profiler sur BEA Workshop 9.2.2, basé sur un viel Eclipse 3.1.2

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    C'est pour cela qu'on utilise des pools de connexions.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par domiq44 Voir le message
    Oui mais ça doit couter de fermer puis ouvrir la connexion à la base à chaque fois
    Bien pour ça que je dit que ça dépend de comment ton application est construite

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 24/04/2009, 19h56
  2. libération de toute la mémoire allouée
    Par salseropom dans le forum C
    Réponses: 17
    Dernier message: 05/11/2007, 16h36
  3. Réponses: 6
    Dernier message: 07/07/2007, 18h12
  4. Libération de la mémoire
    Par gibet_b dans le forum Composants VCL
    Réponses: 3
    Dernier message: 30/06/2004, 12h02
  5. Réponses: 25
    Dernier message: 16/07/2003, 20h41

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