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

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Points : 191
    Points
    191
    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 habitué Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Points : 191
    Points
    191
    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 émérite
    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
    Points : 2 582
    Points
    2 582
    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 habitué Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Points : 191
    Points
    191
    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 émérite
    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
    Points : 2 582
    Points
    2 582
    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 habitué Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Points : 191
    Points
    191
    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???

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Est-ce que tu "disposes" bien tes JDialogs avant de les libérer ?

    Et on pourrait voir comment tu gères tes images ? Car tout mettre en static devrait poser encore plus de problème au GC !

    Enfin appeler explicitement le GC ne permet en aucun cas d'éviter les OutOfMemory... mais peut se révéler de mauvaise performance...


    a++

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Points : 191
    Points
    191
    Par défaut
    Re.

    Au niveau des jdialogs, je mets toutes les références à null, puis je fais this.dispose(), puis System.gc() 2x

    Par contre au niveau du container parent, je ne fais rien, c'est peut être ca le problème?

    Pour me simages, j'ai une classe dédiée, et pour chaque IMage, j'utilise 2 ImageIcon et 1 Image.

    Mais c'est l'objet Image qui me bouffe toutes mes ressources...

    COmme tout est en statique, pas de pb sauf que tout se charge à l'éxecution du programme, et donc 80-100Mo

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