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

Langage Java Discussion :

Resoudre exception java.lang,OutOfMemory


Sujet :

Langage Java

  1. #1
    Battosaiii
    Invité(e)
    Par défaut Resoudre exception java.lang,OutOfMemory
    Bonjour que signifie cette erreur ?
    Exception in "Thread-6" java.lang.OutOfMemoryError: Java heap space
    avec la variante "Thread-4" au lieu de "Thread-6" parfois.
    je pense que le probleme de memoire vient du fait que je cree plusieurs images et que certaines restent en memoire .

    L'erreur semble venir de cette methode, peut etre y a t il une erreur frappante dans ce code ?

    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
    //Get pixels of the 3D image
        public int[] Get3DPixels(int x1,int x2,int y1,int y2,int slice)
        {
        	 System.gc();
        	//boo_3DDrag=true; 
        	int_pic=slice;
        	 int_rectInitX =x1; 
             int_rectInitY =y1;
             int_3DWidthInit =Math.abs(x1-x2); 
             int_3DHeightInit=Math.abs(y1-y2);
        	//Retrieve coordinates information and width and height information
        	
        	//Jbutton3D Action performed
        	// if(Math.min(int_3DWidthInit,int_3DHeightInit)*int_3DWidthInit*int_3DHeightInit<15000000)    //Verify that 3D array is not too big
            // { 
        		int[] pixels=null;
             	System.out.println("ThreeD:Get3DPixels() x1="+x1+" x2="+x2+" y1="+y1+" y2="+y2);
             	
             	//   boo_3DDrag=false;         
                 int_3DWidth = 20;//int_3DWidthInit;
                 int_3DHeight =40;// int_3DHeightInit;
                
                 if(!boo_3DStart) //Rotate the 3D cube on x and z axis
                 {
                	 System.out.println("no rotation rotationx="+rotatex+" rotationz="+rotatez);
                 int_xRotate=0;
                 int_zRotate=0;
                 }
                 else
            	 {
                	 System.out.println("rotation ok rotationx="+rotatex+" rotationz="+rotatez);
                	 int_xRotate=rotatex;//Rotate the object 
                	  int_zRotate=rotatez;
            	 }
                 //jPanel3D.setVisible(true);       
                 //jButton3D.setVisible(false);         
                 //jLabel3DRect.setVisible(false);          
                 jSlider3DDepth.setMinimum(1);     
                 jSlider3DDepth.setMaximum(Math.min(int_3DWidthInit,int_3DHeightInit));        
                 int_3DDepth = jSlider3DDepth.getMaximum()/3;        
                 jSlider3DDepth.setValue(int_3DDepth);                     
                 jSlider3DDist.setMaximum(jSlider3DDepth.getMaximum()); 
                 this.load();
                 var.dist=-1000;      
                 var.pic = new Picture(int_3DWidthInit, int_3DHeightInit);        
                 var.cube = new Cube();   
                 var.vol = new Volume(int_3DWidthInit, int_3DHeightInit, int_3DDepth);          
                 var.pic.setVol(var.vol);
                 var.tr = new Transform(int_3DWidthInit, int_3DHeightInit);    
                 var.tr.setView(Math.toRadians(int_xRotate),Math.toRadians(int_zRotate));
                 //toDisplay = var.pic.newDisplayMode(boo_3DDrag); 
                pixels=var.pic.GetPixels(boo_3DDrag);
                 //   jSlider3DDist.setMinimum(var.dist);         
               //  jSlider3DDist.setValue(var.dist);
               //  jLabel3D.setPreferredSize(new java.awt.Dimension(int_3DWidthInit, int_3DHeightInit));            
               //  jLabel3D.setBounds((widthInVoxels-int_3DWidthInit)/2, (heightInVoxels-int_3DHeightInit)/2, int_3DWidthInit, int_3DHeightInit);         
               //  jLabel3D.setIcon(new ImageIcon(toDisplay));
               //  jLabel3D.repaint();
               //  jLabel3D.setVisible(true);         
            //     boo_3DStart=true;
               //  this.repaint();
             //}
                 System.out.println("ThreeD:Get3DPixels Return Image");
        			//return  toDisplay;
                
             
        	
        	 return pixels;
        }

    Pour resoudre ce type d'erreur j'ai mis des System.gc();
    un peu partout dans le code de mon serveur.
    Que pensez vous de cette initiative ? Quelles sont les autres possibilites ?

  2. #2
    Membre averti Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Points : 328
    Points
    328
    Par défaut
    Si je ne m'abuse, le System.gc() ne force pas l'e garbage collector a tout nettoyer, mais indique qu'il doit être s'occuper de ça le mieux possible (dans la doc, ils disent "the Java Virtual Machine has made a best effort to reclaim" all space etc), en gros, tout n'est pas propre nickel dès que tu fais appel à cette fonction.
    L'exception Java heap space indique effectivement une mémoire maximale allouée insuffisante et peut être contrôlé par l'argument de la JVM suivant : -Xmx256m (où 256m représente 256 Mo et tu mets bien sûr la valeur que tu veux). Ceci, bien sûr n'est valable que si tu controle effectivement la mémoire maximale (exemple, tu sais que ton programme charge entre 10 et 12 grosses images etc). Sinon, je pense que mettre à null toutes les références aux images pour aider au travail du gc dès que tu sais que tu n'en as plus besoin pourrait peut-être aider un peu...

    Voilà voilà, c'est que je vois pour le moment
    bon courage

  3. #3
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    Citation Envoyé par Battosaiii
    Pour resoudre ce type d'erreur j'ai mis des System.gc();
    un peu partout dans le code de mon serveur.
    Que pensez vous de cette initiative ? Quelles sont les autres possibilites ?
    Essaie de voir du coté des Reference (SoftReference...) Je ne connais pas bien, mais de ce que j'en sais, ca peut peut etre t'aider.

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Citation Envoyé par viena
    Essaie de voir du coté des Reference (SoftReference...) Je ne connais pas bien, mais de ce que j'en sais, ca peut peut etre t'aider.
    A ce sujet je recommande les articles suivants :

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Points : 68
    Points
    68
    Par défaut
    si tu as pas une boucle infinie mais une vraie limite de mémoire, ajoute de la mémoire lors du lancement de ta machine java option -Xmx

  6. #6
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Si je ne m'abuse, le System.gc() ne force pas l'e garbage collector a tout nettoyer
    Et puis surtout l'appel a System.gc() ne garantit meme pas que le GC sera demarre !

    Plus d'infos sur le heap et le GC :
    http://www.progx.org/index.php?secti...ies&newsid=314
    http://www.progx.org/index.php?secti...ies&newsid=315

  7. #7
    Battosaiii
    Invité(e)
    Par défaut
    merci de tous vos commentaires. Je vais essayer de faire le tri et voir ce qui marche. Pour l'instant pas de changement et j'ai mis pourtant quelques tableaux a null :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    int [] pixels;
     
    //remplissage de pixels
     
    pixels=null;
    J'obtiens tjrs du java heap error .

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Salut,

    Le problème pourrait être dû à un nombre d'objets trop important en mémoire ou bien à la création d'un objet trop volumineux. Tu pourrais déboguer ton appli en redéfinissant finalize() héritée de Object et lui faire imprimer un message sur la console. Ainsi, tu pourrais voir si l'erreur se produit avant ou après le passage du garbage collector.

    Dans tous les cas, les références douces sont certainement la solution appropriée comme indiqué par viena, le yi@m's et gfx.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Points : 68
    Points
    68
    Par défaut
    perso mon appli m'a fait cette erreur sans aucun problème dans le code, juste un nombre d'objet chargé en mémoire trop grand, le hic c que j'avais vraiment besoin de tous ces objets. d'ou mon choix de monter la taille de la méméoire.

    maintenant il y a aussi la possibilité d'avoir un chargement récursive un peu trop gros (voir infini) qui te la sature aussi. Mais en général tu choppes un stackOoverflowError avant un OutOfMemoryError

  10. #10
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    D'après ton code, tout est défini en dehors de ta fonction directement dans la classe que tu utilises...

    Donc tant que la classe est chargée, tous les derniers objets actifs qui y sont liés seront conservés en mémoire...

    J'ai eu le soucis y'a pas longtemps et j'ai gravement amélioré l'utilisation mémoire en changeant le scope de certains objets que j'utilisais dans une enorme boucle (j'ai presque economisé 200Mo de mémoire comme ca en forcant le GC à bosser)

    Une autre piste de lecture interessante pour le comportement du heap et du GC avec les gros objets

Discussions similaires

  1. Exception : java.lang.NumberFormatException
    Par maxlegrand dans le forum Langage
    Réponses: 3
    Dernier message: 06/07/2007, 12h02
  2. Exception : java.lang.NullPointerException
    Par parano dans le forum Langage
    Réponses: 4
    Dernier message: 05/07/2007, 20h27
  3. Erreur exception java.lang.NullPointerException
    Par geol99 dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2007, 20h24
  4. unreported exception: java.lang.ClassNotFoundException
    Par obydissonn dans le forum JDBC
    Réponses: 1
    Dernier message: 22/03/2007, 16h54
  5. [System.load] Exception java.lang.UnsatisfiedLinkError avec unknown file type
    Par jemini_fr dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 05/02/2007, 13h52

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