Java.lang.OutOfMemoryError: Java heap space

titojava Messages postés 3 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 2 avril 2009 - 1 avril 2009 à 09:03
titojava Messages postés 3 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 2 avril 2009 - 2 avril 2009 à 08:12
Bonjour,

Je suis relativement débutant en JAVA. Je travail actuellement sur un soft pour l'entreprise ou je suis stagiaire, et je suis devant un problème qui, malgré mes recherches, reste non résolu. java.lang.OutOfMemoryError: Java heap space  est une erreur que je peu résoudre en augmentant l'allocation mémoire. Cependant cela ne ferait que retarder mon problème, d'autant plus qu'il est impossible que ce soft requiert autant de ressource.

Le programme est un logiciel de diagramme de phase. il retranscrit un diagramme d'aprés un certain nombre de taches qui dépendent les unes des autres. Mon programme est composé d'une classe "Diagramme" qui utilise des objet de type "Tache" que j'ai créé et qui contiennent plusieurs fonction. Il n'y a , a priori, aucun probléme avec ces classes. le main, crée une JFrame qui contient un menu, et un système d'onglets. un onglet contient 3 JPanel (gauche, droite et bas, qui sont separé par des JSplit. le panneau de gauche contient un tableau qui repertorie chaque tache avec leur caractéristique, et le panneau de droite contient le dessin du diagramme. Pour finir le panneau du bas ne contient rien pour le moment.

J'en viens au problème. pour éditer une tache j'appel un objet TaskDialog qui hérite de JDialog, ou je programme les type d'édition selon les paramétre que l'on veux alouer a la tache.
Alors voila comment ca se passe:
je compile le programme, je crée un nouvel onglet (un nouveau diagramme quoi) , je crée une nouvelle tache. Jusque la tout va bien. maintenant je l'édite, a premiére vue l'édition marche correctement, le TaskDialog marche bien. Cependant au bout d'un certain nombre d'appel a TaskDialog j'ai l'erreur java.lang.OutOfMemoryError: Java heap space alors que je n'ai pour le moment qu'une seule et unique tache et que celle ci ne dépend de rien du tout. J'en déduit donc que le probléme vien de la TaskDialog.

voici comment j'instancie ma boite de dialogue:
je la crée: TaskDialog editTask;

ensuite dans une fonction appelée "boite edition" qui prend un int en paramétre j'instancie ma boite:

editTask = new TaskDialog(null,d.tableauTache[i].id,true,d.tableauTache[i],this);

d.tableauTache est un tableau de tache contenu dans le diagramme" d", "i" est la tache concernée par l'édition
"id" est le nom de la tache suivi de son emplacement dans le tableau.

je vais poster le code avec les comentaires dans le message suivant.

2 réponses

titojava Messages postés 3 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 2 avril 2009
1 avril 2009 à 09:21

//voila le code, il y a 600 lignes, donc il vaux mieux utiliser notePad pour le lire.//Import des bibliotheques utilisée dans cette classeimport java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.lang.management.ManagementFactory;import java.lang.management.MemoryMXBean;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;

public class TaskDialog extends JDialog { private static final long serialVersionUID = 1L; //tache Editée contient la tache que l'ont est en train d'éditer protected Tache tacheEditee; //les panneau ci dessous sont les différent panneau d'affichage et d'édition  protected JPanel panDebutE, panFinE, panVitesse, panDistance,  panDuree, panDureeE,  panAcceleration, panDistAccel, panDeceleration, panDistDecel, panAngle, panRayon, panVitessAng; //les panneau ci dessous contiennent les panneau d'affichage et d'édition protected JPanel content, contentGauche, contentDroite; //tabmodele contient le TabModele utilisé pour le tableau, c'est dans cet objet que l'on appel la boite de dialogue, ici j'en ai besoin pour rappeler la fonction d'édition protected TabModel tabmodele; //les JLabel permettent l'affichage des caractéristiques private JLabel nomA,nomEnsembleA,debutA,finA,dureeA,commandeA,vitesseA,distanceA,accelA,distAccelA,decelA,distDecelA,rayonA, angleA, vitesseAngA, predecesseurA, typePreA;//A:Affichage //les jtextfield permettent la saisie pour l'édition private JTextField nomE,nomEnsembleE,debutE,finE,dureeE,vitesseE,distanceE,accelE,distAccelE,decelE,distDecelE,rayonE, angleE, vitesseAngE;//E: Edition //idem pour les JComboBox private JComboBox commandeE,predecesseurE,predecesseurS,typePreE; //----------------------------------------------------------------------------------CONSTRUCTEUR DE LA BOITE DE DIALOGUE public TaskDialog(JFrame parent, String title,boolean modal,Tache t, TabModel tab){  super(parent, title, modal);// on appel le constructeur de JDialog  this.tabmodele=tab; //on recupere le TabModele  this.tacheEditee=t; //on récupere la tache éditée  this.setSize(700,600); //on défini une taille a notre JDialog  this.setLocationRelativeTo(null);   this.setResizable(false);  this.setBackground(Color.white);  this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);  this.initComponent(); // appel de l'initialisation  this.setVisible(true); //on l'affiche } //---------------------------------------------------------------------------------INITIALISATION DU COMPOSANT private void initComponent(){  //nom   JPanel panNom = new JPanel();   panNom.setBackground(Color.white);   panNom.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   nomE=new JTextField();   nomE.setPreferredSize(new Dimension(100,15));   panNom.setBorder(BorderFactory.createTitledBorder("editer le nom :"));   nomA= new JLabel(this.tacheEditee.nomTache);   panNom.setLayout(new GridLayout(1,2));   panNom.add(nomA);   panNom.add(nomE);    //nom ensemble   JPanel panNomEnsemble = new JPanel();   panNomEnsemble.setBackground(Color.white);   panNomEnsemble.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   nomEnsembleE=new JTextField();   nomEnsembleE.setPreferredSize(new Dimension(100,15));   panNomEnsemble.setBorder(BorderFactory.createTitledBorder("editer le type :"));   nomEnsembleA= new JLabel(this.tacheEditee.nomEnsemble);   panNomEnsemble.setLayout(new GridLayout(1,2));   panNomEnsemble.add(nomEnsembleA);   panNomEnsemble.add(nomEnsembleE);    //commande   JPanel panCommande = new JPanel();   panCommande.setBackground(Color.white);   panCommande.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   commandeE= new JComboBox();   commandeE.addItem("NA");   commandeE.addItem("Fourchette");   commandeE.addItem("Vitesse");   commandeE.addItem("Durée");   commandeE.addItem("Accel/decel");   commandeE.addItem("Vitesse angulaire");   commandeA= new JLabel("type de commande");   switch(this.tacheEditee.commande){   case -1://-1:pas de commande attribuée, la tache est inactive    commandeE.setSelectedItem("NA");    break;   case 0://0:fourchette de temps      commandeE.setSelectedItem("Fourchette");    break;   case 1://1:vitesse     commandeE.setSelectedItem("Vitesse");    break;   case 2://2:temps depart plus duree     commandeE.setSelectedItem("Durée");    break;   case 3://3:accel/decel    commandeE.setSelectedItem("Accel/decel");    break;   case 4://4:vitesse angulaire    commandeE.setSelectedItem("Vitesse angulaire");    break;   }   panCommande.add(commandeA);   panCommande.add(commandeE);   commandeE.addActionListener(new ActionListener(){    public void actionPerformed(ActionEvent arg0) {     appliquer();    }});   //début   JPanel panDebut = new JPanel();   panDebut.setBackground(Color.white);   panDebut.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panDebut.setBorder(BorderFactory.createTitledBorder("début :"));   debutA= new JLabel(Double.toString(this.tacheEditee.debutTache));   panDebut.add(debutA);      //début-> Edition   panDebutE = new JPanel();   panDebutE.setBackground(Color.white);   panDebutE.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panDebutE.setBorder(BorderFactory.createTitledBorder("début :"));   switch(tacheEditee.typePre){    case 0:     debutE= new JTextField();     debutE.setPreferredSize(new Dimension(100,15));     panDebutE.add(debutE);     break;    case 1:     JLabel infoDebut= new JLabel("Tache de début de process");     panDebutE.add(infoDebut);     break;    case 2:     String s= new String("Predecesseur(s):");     predecesseurE = new JComboBox();     predecesseurS = new JComboBox();      for(int i=0;i=0){        predecesseurS.addItem(this.tabmodele.d.tableauTache[this.tacheEditee.predecesseur[i]].id);        s=s+this.tabmodele.d.tableauTache[this.tacheEditee.predecesseur[i]].nomTache+"; ";      }     }     predecesseurA = new JLabel(s);     int[] tabPredecesseurPossible;     for(int i=0;i Edition   panFinE = new JPanel();   panFinE.setBackground(Color.white);   panFinE.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panFinE.setBorder(BorderFactory.createTitledBorder("Fin :"));   finE= new JTextField();   finE.setPreferredSize(new Dimension(100,15));   panFinE.add(finE);    //choix type de predecesseur   JPanel panTypePre = new JPanel();   panTypePre.setBackground(Color.white);   panTypePre.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   typePreE= new JComboBox();   typePreE.addItem("libre");   typePreE.addItem("début de process");   typePreE.addItem("predecesseur(s)");   typePreA= new JLabel("type de dépendance");   switch(this.tacheEditee.typePre){   case 0://0:fourchette de temps      typePreE.setSelectedItem("libre");    break;   case 1://1:vitesse     typePreE.setSelectedItem("début de process");    break;   case 2://2:temps depart plus duree     typePreE.setSelectedItem("predecesseur(s)");    break;   }   typePreE.addActionListener(new ActionListener(){    public void actionPerformed(ActionEvent arg0) {     appliquer();    }});   panTypePre.add(typePreA);   panTypePre.add(typePreE);    //duree   panDuree = new JPanel();   panDuree.setBackground(Color.white);   panDuree.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panDuree.setBorder(BorderFactory.createTitledBorder("Durée :"));   dureeA= new JLabel(Double.toString(this.tacheEditee.dureeTache));   panDuree.add(dureeA);    //duree --> Edition   panDureeE = new JPanel();   panDureeE.setBackground(Color.white);   panDureeE.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panDureeE.setBorder(BorderFactory.createTitledBorder("Durée :"));   dureeE= new JTextField();   dureeE.setPreferredSize(new Dimension(100,15));   panDureeE.add(dureeE);    //vitesse   JPanel panVitesse = new JPanel();   panVitesse.setBackground(Color.white);   panVitesse.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panVitesse.setBorder(BorderFactory.createTitledBorder("Vitesse :"));   vitesseA= new JLabel(Double.toString(this.tacheEditee.vitesse));   vitesseE =  new JTextField();   vitesseE.setPreferredSize(new Dimension(100,15));   panVitesse.setLayout(new GridLayout(1,2));   panVitesse.add(vitesseA);   panVitesse.add(vitesseE);    //distance   JPanel panDistance = new JPanel();   panDistance.setBackground(Color.white);   panDistance.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panDistance.setBorder(BorderFactory.createTitledBorder("Distance :"));   distanceA= new JLabel(Double.toString(this.tacheEditee.distance));   panDistance.add(distanceA);   distanceE= new JTextField();   distanceE.setPreferredSize(new Dimension(100,15));   panDistance.add(distanceE);   panDistance.setLayout(new GridLayout(1,2));    //acceleration   JPanel panAcceleration = new JPanel();   panAcceleration.setBackground(Color.white);   panAcceleration.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panAcceleration.setBorder(BorderFactory.createTitledBorder("Acceleration :"));   accelA= new JLabel(Double.toString(this.tacheEditee.acceleration));   accelE= new JTextField();;   accelE.setPreferredSize(new Dimension(100,15));   panAcceleration.setLayout(new GridLayout(1,2));   panAcceleration.add(accelA);   panAcceleration.add(accelE);    //distance acceleration   JPanel panDistAccel = new JPanel();   panDistAccel.setBackground(Color.white);   panDistAccel.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panDistAccel.setBorder(BorderFactory.createTitledBorder("Distance accel :"));   distAccelA= new JLabel(Double.toString(this.tacheEditee.distanceAccel));   distAccelE= new JTextField();   distAccelE.setPreferredSize(new Dimension(100,15));   panDistAccel.setLayout(new GridLayout(1,2));   panDistAccel.add(distAccelA);   panDistAccel.add(distAccelE);    //deceleration   JPanel panDeceleration = new JPanel();   panDeceleration.setBackground(Color.white);   panDeceleration.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panDeceleration.setBorder(BorderFactory.createTitledBorder("Déceleration :"));   decelA= new JLabel(Double.toString(this.tacheEditee.deceleration));   decelE= new JTextField();   decelE.setPreferredSize(new Dimension(100,15));   panDeceleration.setLayout(new GridLayout(1,2));   panDeceleration.add(decelA);   panDeceleration.add(decelE);    //distance deceleration   JPanel panDistDecel = new JPanel();   panDistDecel.setBackground(Color.white);   panDistDecel.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panDistDecel.setBorder(BorderFactory.createTitledBorder("Distance decel :"));   distDecelA= new JLabel(Double.toString(this.tacheEditee.distanceDecel));   distDecelE=  new JTextField();   distDecelE.setPreferredSize(new Dimension(100,15));   panDistDecel.setLayout(new GridLayout(1,2));   panDistDecel.add(distDecelA);   panDistDecel.add(distDecelE);  //rayon   JPanel panRayon = new JPanel();   panRayon.setBackground(Color.white);   panRayon.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panRayon.setBorder(BorderFactory.createTitledBorder("Rayon:"));   rayonA= new JLabel(Double.toString(this.tacheEditee.rayon));   rayonE=  new JTextField();   rayonE.setPreferredSize(new Dimension(100,15));   panRayon.setLayout(new GridLayout(1,2));   panRayon.add(rayonA);   panRayon.add(rayonE);    //angle   JPanel panAngle = new JPanel();   panAngle.setBackground(Color.white);   panAngle.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panAngle.setBorder(BorderFactory.createTitledBorder("Angle de deplacement:"));   angleA= new JLabel(Double.toString(this.tacheEditee.angle));   angleE= new JTextField();   angleE.setPreferredSize(new Dimension(100,15));   panAngle.setLayout(new GridLayout(1,2));   panAngle.add(angleA);   panAngle.add(angleE);    //vitesse angulaire   JPanel panVitessAng = new JPanel();   panVitessAng.setBackground(Color.white);   panVitessAng.setPreferredSize(new Dimension((int)((this.getWidth()/2)-10),60));   panVitessAng.setBorder(BorderFactory.createTitledBorder("Angle de deplacement:"));   vitesseAngA= new JLabel(Double.toString(this.tacheEditee.vitesseAngulaire));   vitesseAngE= new JTextField();   vitesseAngE.setPreferredSize(new Dimension(100,15));   panVitessAng.setLayout(new GridLayout(1,2));   panVitessAng.add(vitesseAngA);   panVitessAng.add(vitesseAngE);  //=======================================================================================ajout des panneau aux panneau principaux  contentGauche= new JPanel();  contentGauche.setBackground(Color.white);  contentGauche.setSize((int)(this.getSize().width/2), this.getSize().height);  contentGauche.setBorder(BorderFactory.createTitledBorder("proprietés"));  contentGauche.add(panNom);  contentGauche.add(panNomEnsemble);  contentGauche.add(panDebut);  contentGauche.add(panFin);  contentGauche.add(panDuree);  contentGauche.add(panCommande);  contentGauche.add(panTypePre);    contentDroite= new JPanel();  contentDroite.setSize((int)(this.getSize().width/2), this.getSize().height);  contentDroite.setBackground(Color.white);  contentDroite.setBorder(BorderFactory.createTitledBorder("Edition"));  switch(this.tacheEditee.commande){ // suivant le type de commande de la tache on affiche que certaines boites d'édition   case -1://-1:pas de commande attribuée, la tache est inactive    break;   case 0://0:fourchette de temps      if(this.tacheEditee.typePre==2){contentDroite.add(predecesseurA);}    contentDroite.add(panDebutE);        contentDroite.add(panFinE);    break;   case 1://1:vitesse     if(this.tacheEditee.typePre==2){contentDroite.add(predecesseurA);}    contentDroite.add(panDebutE);    contentDroite.add(panVitesse);    contentDroite.add(panDistance);    break;   case 2://2:temps depart plus duree     if(this.tacheEditee.typePre==2){contentDroite.add(predecesseurA);}    contentDroite.add(panDebutE);    contentDroite.add(panDureeE);    break;   case 3://3:accel/decel    if(this.tacheEditee.typePre==2){contentDroite.add(predecesseurA);}    contentDroite.add(panDebutE);    contentDroite.add(panAcceleration);    contentDroite.add(panDistAccel);    contentDroite.add(panDeceleration);    contentDroite.add(panDistDecel);    break;   case 4://4:vitesse angulaire    if(this.tacheEditee.typePre==2){contentDroite.add(predecesseurA);}    contentDroite.add(panDebutE);    contentDroite.add(panAngle);    contentDroite.add(panRayon);    contentDroite.add(panVitessAng);    break;  }  JPanel controle = new JPanel();//panneau de controle contenant appliquer et quitter    JButton okBouton = new JButton("Appliquer");  okBouton.addActionListener(new ActionListener(){   public void actionPerformed(ActionEvent arg0) {    tableauInfluence();    appliquer();   }});    JButton cancelBouton = new JButton("quitter");  cancelBouton.addActionListener(new ActionListener(){   public void actionPerformed(ActionEvent arg0) {    setVisible(false);   }});  controle.add(okBouton);  controle.add(cancelBouton);    content= new JPanel();  content.setBackground(Color.white);  content.setSize(700, 600);  content.add(contentGauche,BorderLayout.EAST);  content.add(contentDroite,BorderLayout.WEST);  content.setLayout(new GridLayout(1,2));    this.getContentPane().add(content, BorderLayout.CENTER);  this.getContentPane().add(controle, BorderLayout.SOUTH); } public void appliquer(){  //cette fonction applique les changement en changeant directement les variable dans la tache, a la fin, celle ci reappel la fonction d'edition de TabModel afin que la boite se réaffiche.   if(typePreE.getSelectedItem().toString().equals("libre")){this.tacheEditee.typePre=0;}   else if(typePreE.getSelectedItem().toString().equals("début de process")){this.tacheEditee.typePre=1;}   else if(typePreE.getSelectedItem().toString().equals("predecesseur(s)")){this.tacheEditee.typePre=2;}     if(commandeE.getSelectedItem().toString().equals("NA")){this.tacheEditee.commande=-1;}   else if(commandeE.getSelectedItem().toString().equals("Fourchette")){this.tacheEditee.commande=0;}   else if(commandeE.getSelectedItem().toString().equals("Vitesse")){this.tacheEditee.commande=1;}   else if(commandeE.getSelectedItem().toString().equals("Durée")){this.tacheEditee.commande=2;}   else if(commandeE.getSelectedItem().toString().equals("Accel/decel")){this.tacheEditee.commande=3;}   else if(commandeE.getSelectedItem().toString().equals("Vitesse angulaire")){this.tacheEditee.commande=4;}  if(nomE.getText().equals("")==false){    this.tacheEditee.nomTache=nomE.getText();    this.tacheEditee.id=nomE.getText()+" ["+this.tacheEditee.numero+"]";  }    if(nomEnsembleE.getText().equals("")==false){    this.tacheEditee.nomEnsemble=nomEnsembleE.getText();  }  switch(this.tacheEditee.commande){   case 0:    try{if(debutE.getText().equals("")==false){this.tacheEditee.debutTache=Double.parseDouble(debutE.getText());}}catch(java.lang.NullPointerException e){}    try{if(finE.getText().equals("")==false){this.tacheEditee.finTache=Double.parseDouble(finE.getText());}}catch(java.lang.NullPointerException e){}    break;   case 1:    try{if(debutE.getText().equals("")==false){this.tacheEditee.debutTache=Double.parseDouble(debutE.getText());}}catch(java.lang.NullPointerException e){}    try{if(vitesseE.getText().equals("")==false){this.tacheEditee.vitesse=Double.parseDouble(vitesseE.getText());}}catch(java.lang.NullPointerException e){}    try{if(distanceE.getText().equals("")==false){this.tacheEditee.distance=Double.parseDouble(distanceE.getText());}}catch(java.lang.NullPointerException e){}    break;   case 2:    try{if(debutE.getText().equals("")==false){this.tacheEditee.debutTache=Double.parseDouble(debutE.getText());}}catch(java.lang.NullPointerException e){}    try{if(dureeE.getText().equals("")==false){this.tacheEditee.dureeTache=Double.parseDouble(dureeE.getText());}}catch(java.lang.NullPointerException e){}    break;   case 3:    try{if(debutE.getText().equals("")==false){this.tacheEditee.debutTache=Double.parseDouble(debutE.getText());}}catch(java.lang.NullPointerException e){}    try{if(accelE.getText().equals("")==false){this.tacheEditee.acceleration=Double.parseDouble(accelE.getText());}}catch(java.lang.NullPointerException e){}    try{if(decelE.getText().equals("")==false){this.tacheEditee.deceleration=Double.parseDouble(decelE.getText());}}catch(java.lang.NullPointerException e){}    try{if(distAccelE.getText().equals("")==false){this.tacheEditee.distanceAccel=Double.parseDouble(distAccelE.getText());}}catch(java.lang.NullPointerException e){}    try{if(distDecelE.getText().equals("")==false){this.tacheEditee.distanceDecel=Double.parseDouble(distDecelE.getText());}}catch(java.lang.NullPointerException e){}    break;   case 4:    try{if(debutE.getText().equals("")==false){this.tacheEditee.debutTache=Double.parseDouble(debutE.getText());}}catch(java.lang.NullPointerException e){}    try{if(rayonE.getText().equals("")==false){this.tacheEditee.rayon=Double.parseDouble(rayonE.getText());}}catch(java.lang.NullPointerException e){}    try{if(angleE.getText().equals("")==false){this.tacheEditee.angle=Double.parseDouble(angleE.getText());}}catch(java.lang.NullPointerException e){}    try{if(vitesseAngE.getText().equals("")==false){this.tacheEditee.vitesseAngulaire=Double.parseDouble(vitesseAngE.getText());}}catch(java.lang.NullPointerException e){}    break;  }   this.tacheEditee.maj();  //mise a jour  for(int i=0;i0&&test==false){   int j=0;   for(int i=0;i
0
titojava Messages postés 3 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 2 avril 2009
2 avril 2009 à 08:12
up
0
Rejoignez-nous