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érer de la mémoire


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut Libérer de la mémoire
    Bonjour à tous, je me pose une petite question sur la gestion de la mémoire en Java.

    J'utilise cette procédure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private void enregistreImage(String name)
    {
    	Image img = new ImageIcon("images/"+name).getImage().getScaledInstance(640*facteurEchelle/100, 640*facteurEchelle/100, Image.SCALE_SMOOTH);
    	File f = new File("use/"+name);
    	try {
    		ImageIO.write(toBufferedImage(img), "png", f);
    	} catch (IOException e) {
     
    		e.printStackTrace();
    	}
    Dont le seul but est de lire une image, de la redimensionner à la bonne échelle et de l'enregistrer dans un fichier.

    Cette procédure est appelée 30 fois dans le programme pour 30 images différentes.

    Le seul soucis c'est que l'utilisation de la mémoire explose (190 Mo supplémentaire depuis que j'ai instauré ce système)

    D'après ce que j'ai pu lire, le garbage collector serait censé libérer la mémoire automatiquement.

    Or la variable img étant locale à la procédure, elle devrait être détruite à la fin de chaque appel.

    Y a-t-il un moyen de forcer le programme à libérer la mémoire de ces images qui semblent perdurer ?

    Ou est ce que j'aurais mal compris quelque chose ?

    Merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    Bonsoir, j'ai modifié mon code comme suit.

    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
     
    private void enregistreImage(String name)
    {
     
    	Image img = new ImageIcon("images/"+name).getImage();
     
    	BufferedImage smaller = new BufferedImage(640*facteurEchelle/100, 640*facteurEchelle/100,BufferedImage.TYPE_INT_ARGB);
     
    	Graphics2D graph = smaller.createGraphics();
     
    	graph.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
     
    	graph.drawImage(img, 0, 0, 640*facteurEchelle/100, 640*facteurEchelle/100, null);
     
    	graph.dispose();
     
    	File f = new File("use/"+name);
    	try {
    		ImageIO.write(smaller, "png", f);
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    	img = null;
    	smaller=null;
     
     
    }
    Mais le problème reste intact.

    Avec ou sans l'appel à cette fonction, la différence d'utilisation mémoire est de 180 Mo

    Merci tout de même pour les éclaircissement concernant getScaleInstance() JE ne savais pas qu'elle gardait une référence.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    Problème résolu.

    Il fallait remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mg = null;
    	smaller=null;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    img.flush();
    	smaller.flush();
    Comme indiqué dans le message cité.

    Merci beaucoup !!

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

Discussions similaires

  1. Libérer de la mémoire en vidant des variables images
    Par PoZZyX dans le forum Windows Forms
    Réponses: 4
    Dernier message: 05/02/2008, 11h28
  2. Comment libérer de la mémoire ?
    Par dam2p dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/08/2007, 23h05
  3. Réponses: 7
    Dernier message: 06/06/2006, 15h38
  4. Comment libérer l'éspace mémoire utilisé par Acrobat Reader?
    Par Matt2094 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 28/03/2006, 17h48
  5. [VB.NET][dataset] libérer de la mémoire
    Par JauB dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/01/2006, 12h58

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