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

AWT/Swing Java Discussion :

Images et java Heap Space


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Images et java Heap Space
    Bonjour,

    j'ai un problème avec les images....

    Je pense que c'est la manière donc je les déclerent qui ne vas pas.

    Bref, j'ai ne vingtaine d'images pas trop volumineuse et un programme qui charge ces images selon les fenetres.

    Au bout d'un moment, après une dizaine de fenetres bien chargées, j'ai ce message d'erreur et plus d'images :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
    	at java.awt.image.DataBufferInt.<init>(Unknown Source)
    	at java.awt.image.Raster.createPackedRaster(Unknown Source)
    	at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
    	at sun.awt.image.ImageRepresentation.createBufferedImage(Unknown Source)
    	at sun.awt.image.ImageRepresentation.setPixels(Unknown Source)
    	at java.awt.image.ReplicateScaleFilter.setPixels(Unknown Source)
    	at sun.awt.image.ImageDecoder.setPixels(Unknown Source)
    	at sun.awt.image.JPEGImageDecoder.sendPixels(Unknown Source)
    	at sun.awt.image.JPEGImageDecoder.readImage(Native Method)
    	at sun.awt.image.JPEGImageDecoder.produceImage(Unknown Source)
    	at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
    	at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
    	at sun.awt.image.ImageFetcher.run(Unknown Source)
    Mon programme est strucutré ainsi :

    UNe seul JFRame toujours en exécution, et à chaque clic sur un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JDialog madialog = new JDIalog(...);
    ......
    Est ce que ca vient du fait que l'objet JDialog madialog soit créer à chaque fois que je clique sur le bouton? Et dans ce cas, il suffit de faire JDIalog madialogtout en haut de la classe, ou est ce que ce n'es tpas du tout le problème?

  2. #2
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut ou alors
    Ce que je pense c'est que ca vient du constructeur new JDialog();
    qui alloue de à chaque fois la mémoire qu'il a besoin pour la classe sans désallouer le reste


    ?

  3. #3
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Que deviennent les JDialog que tu as chargés précédemment ? Restent-ils affichés à l'écran ? Restent-ils dans tes variables ?

  4. #4
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Non
    Elles ne restent pas affichés.

    En fait, j'ai un menu principal JFrame et chaque bouton ou vre une JDialog, à partir des quelles ont peut ouvrir encore d'autres JDialog

    Pour l'instant, à chaque ouverture de JDialog, je fais new JDialog(...);

    et ma question est de savoir si il faut que je refonde tout mon code de façon à ne pas gonfler la mémoire, ou si en en faisant sauter les références de chaque objet en sortie de ces Jdialogs et en appelant le GC, par exemple, ca suffirait?

    J'aurais tendance à dire que la deuxième solution ne marche pas forcément, mais elle m'arrangerrai bien par rapport à la première

  5. #5
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Donc, si je comprends bien, d'une JDialog donnée tu ouvres une autre JDialog. J'imagine que tu rends la première invisible, puis que tu rends la seconde visible. Et cela, 10 fois.

    Et au fur et à mesure, chaque JDialog garde son image en mémoire, du moins je suppose. Donc à chaque nouvelle JDialog tu accumules les demandes mémoires, sans jamais les libérer, car le fait de rendre invisible une JDialog ne libère que peu de mémoire. Même un dispose() ne libèrerait pas la mémoire occupée par ton image.

    Si tu veux garder ce schéma, il faut que tu lâches temporairement les grosses demandes mémoires à chaque nouveau niveau. Cela veut dire que tu vas devoir mettre à null l'image de niveau n avant de rendre visible le niveau n+1 et charger son image, et, lorsque le niveau n redevient visible, que tu lâches l'image niveau n+1, et recharge l'image niveau n.

    Ou bien... te demander s'il est vraiment user friendly d'accumuler 10 niveaux de JDialog ?

  6. #6
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut j'accumule
    J'accumule pas 10 jdialog à la suite...

    Au maximum, j'ai MA frame + 3 Dialogs en même temps.

    J'ai testé ta solution, et elle ne marche pas...

    A chaque sortie de Jdialog je fesait monimage = null; + appel du GC

    Mais ca plante pareil....

    Le seul moyen que j'ai trouvé pour l'instant, c'est de déclarer mes images en static dans une classe dédiée...

    Bon c'est pas très propre, ca charge tout en même temps (80-100 mo), mais ca marche..

    Cependant, j'ai encore des fuites de mémoire, ko par ko...

    J'immagine que si je mets toutes mes variables à null en sortie de jdialog, ca ne va pas mieux marcher que pour les images....

    Donc la seule solution que je vois c'est de faire new JDialog(); une seule fois, et de faire setVisible true/false, non?


    Comment vous faites vous???

Discussions similaires

  1. [Info] Chargement image et Java heap space
    Par dazz_x dans le forum Langage
    Réponses: 9
    Dernier message: 11/09/2007, 11h51
  2. Probleme de java heap space : creation buffered image!
    Par Battosaiii dans le forum Multimédia
    Réponses: 7
    Dernier message: 06/08/2007, 10h49
  3. Probleme : Java heap space et images
    Par Crowell dans le forum Langage
    Réponses: 3
    Dernier message: 20/04/2007, 17h05
  4. Eclipse erreur : java.lang.OutOfMemoryError: Java heap space
    Par sderecourt dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 14/04/2006, 11h28
  5. [ memoire ] Java Heap Space
    Par natha dans le forum Général Java
    Réponses: 10
    Dernier message: 23/01/2006, 11h15

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