"AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

Fermé
Amaurykas Messages postés 6 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 3 mars 2015 - Modifié par Amaurykas le 12/05/2013 à 19:06
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 12 mai 2013 à 20:29
Bonjour, j'ai de nouveau besoin de vos lumières :
Je travaille actuellement sur un programme de simulation de trajectoire de tête de lecture.
Afin de déterminée le chemin le moins cher que la tête de lecture puisse faire, je créer un arbre des chemins possible, malheureusement, cette méthode étant appelée plusieurs fois, java finit par manquer de mémoire. Je souhaiterais savoir si il est possible de supprimer mes arbres une fois utilisé ou bien si vous avez une idée pour rendre mon programme moins gourmand.
public void creaFils(Noeud nPere){
		if (nPere.gettValeur()[0] != 0 && nPere.gettValeur()[0] != iRayMax && nPere.gettValeur()[1]!= iNbrSect) {
			nPere.ajouter(new Noeud(nPere.gettValeur()[0]-1,nPere.gettValeur()[1]+1,nPere.getiNiveau()+1),new Noeud(nPere.gettValeur()[0],nPere.gettValeur()[1]+1,nPere.getiNiveau()+1),new Noeud(nPere.gettValeur()[0]+1,nPere.gettValeur()[1]+1,nPere.getiNiveau()+1));
			lListe.addLast(nPere.getnFils1());//On ajoute le 1er fils a l'annuaire
			lListe.addLast(nPere.getnFils2());//On ajoute le 2eme fils a l'annuaire
			lListe.addLast(nPere.getnFils3());//On ajoute le 3eme fils a l'annuaire
			lListeCrea.addLast(nPere.getnFils1());//On ajoute le 1er fils a la filo
			lListeCrea.addLast(nPere.getnFils2());//On ajoute le 2eme fils a la filo
			lListeCrea.addLast(nPere.getnFils3());//On ajoute le 3eme fils a la filo
			}//cas parfait
		if (nPere.gettValeur()[0] == 0 && nPere.gettValeur()[1]!= iNbrSect) {
			nPere.ajouter(new Noeud(nPere.gettValeur()[0],nPere.gettValeur()[1]+1,nPere.getiNiveau()+1),new Noeud(nPere.gettValeur()[0]+1,nPere.gettValeur()[1]+1,nPere.getiNiveau()+1));
			lListe.addLast(nPere.getnFils1());//On ajoute le 1er fils a l'annuaire
			lListe.addLast(nPere.getnFils2());//On ajoute le 2eme fils a l'annuaire
			lListeCrea.addLast(nPere.getnFils1());//On ajoute le 1er fils a la filo
			lListeCrea.addLast(nPere.getnFils2());//On ajoute le 2eme fils a la filo
			}//cas trop au centre
		if (nPere.gettValeur()[0] == iRayMax && nPere.gettValeur()[1]!= iNbrSect) {
			nPere.ajouter(new Noeud(nPere.gettValeur()[0]-1,nPere.gettValeur()[1]+1,nPere.getiNiveau()+1),new Noeud(nPere.gettValeur()[0],nPere.gettValeur()[1]+1,nPere.getiNiveau()+1));
			lListe.addLast(nPere.getnFils1());//On ajoute le 1er fils a l'annuaire
			lListe.addLast(nPere.getnFils2());//On ajoute le 2eme fils a l'annuaire
			lListeCrea.addLast(nPere.getnFils1());//On ajoute le 1er fils a la filo
			lListeCrea.addLast(nPere.getnFils2());//On ajoute le 2eme fils a la filo
			}//cas trop à l'extérieur
		if (nPere.gettValeur()[0] != 0 && nPere.gettValeur()[0] != iRayMax && nPere.gettValeur()[1]== iNbrSect) {
			nPere.ajouter(new Noeud(nPere.gettValeur()[0]-1,0,nPere.getiNiveau()+1),new Noeud(nPere.gettValeur()[0],0,nPere.getiNiveau()+1),new Noeud(nPere.gettValeur()[0]+1,0,nPere.getiNiveau()+1));
			lListe.addLast(nPere.getnFils1());//On ajoute le 1er fils a l'annuaire
			lListe.addLast(nPere.getnFils2());//On ajoute le 2eme fils a l'annuaire
			lListe.addLast(nPere.getnFils3());//On ajoute le 3eme fils a l'annuaire
			lListeCrea.addLast(nPere.getnFils1());//On ajoute le 1er fils a la filo
			lListeCrea.addLast(nPere.getnFils2());//On ajoute le 2eme fils a la filo
			lListeCrea.addLast(nPere.getnFils3());//On ajoute le 3eme fils a la filo
			}//cas trop en bas
		if (nPere.gettValeur()[0] == 0 && nPere.gettValeur()[0] != iRayMax && nPere.gettValeur()[1]== iNbrSect) {
			nPere.ajouter(new Noeud(nPere.gettValeur()[0],0,nPere.getiNiveau()+1),new Noeud(nPere.gettValeur()[0]+1,0,nPere.getiNiveau()+1));
			lListe.addLast(nPere.getnFils1());//On ajoute le 1er fils a l'annuaire
			lListe.addLast(nPere.getnFils2());//On ajoute le 2eme fils a l'annuaire
			lListeCrea.addLast(nPere.getnFils1());//On ajoute le 1er fils a la filo
			lListeCrea.addLast(nPere.getnFils2());//On ajoute le 2eme fils a la filo
			}//cas trop en bas + trop au centre
		if (nPere.gettValeur()[0] == iRayMax && nPere.gettValeur()[1]== iNbrSect) {
			nPere.ajouter(new Noeud(nPere.gettValeur()[0]-1,0,nPere.getiNiveau()+1),new Noeud(nPere.gettValeur()[0],0,nPere.getiNiveau()+1));
			lListe.addLast(nPere.getnFils1());//On ajoute le 1er fils a l'annuaire
			lListe.addLast(nPere.getnFils2());//On ajoute le 2eme fils a l'annuaire
			lListeCrea.addLast(nPere.getnFils1());//On ajoute le 1er fils a la filo
			lListeCrea.addLast(nPere.getnFils2());//On ajoute le 2eme fils a la filo
			}//cas trop en bas + trop à l'extérieur
	}
		
	public void creaArbre(int[] tDepart, int[] tArrivee ){
		  iNbrTour=0;
		  while(Math.abs(tArrivee[0]-tDepart[0])>iNbrTour*(iNbrSect+1)+(tArrivee[1]-tDepart[1])){
			  iNbrTour++;
		  }
		  iTailleArbre=(iNbrTour*(iNbrSect+1)+(tArrivee[1]-tDepart[1]));
		  if (iTailleArbre==0){
			  iTailleArbre=iNbrSect+1;
		  }
		  Noeud nRacine = new Noeud(tDepart[0],tDepart[1],0);// creation du noeud racine
		  lListeCrea.clear();
		  lListe.clear();
		  lListeCrea.addLast(nRacine);
		  while (lListeCrea.size()!=0){
		  nNoeudTest=lListeCrea.pop();
		  if (nNoeudTest.getiNiveau() !=iTailleArbre){
			  creaFils(nNoeudTest);			  
		  }		  
		  }
	}
	
	public LinkedList<int[]> creaChemin(Noeud nArrivee){//création du chemin reliant deux positions du DD, méthode non opti
		nNoeudTest=nArrivee;
		lChemin.clear();
		while (nNoeudTest.getiNiveau()!=0){
			lChemin.addLast(nNoeudTest.gettValeur());
			nNoeudTest=nNoeudTest.getnPere();
		}
		return lChemin;
	}

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
12 mai 2013 à 20:29
Java libère automatiquement la mémoire lorsqu'il n'en a plus, mais il faut pour cela que les données dont tu ne te sers plus ne soient plus accessibles. Dans ton cas il s'agit par exemple de les supprimer de tes listes dès que tu ne t'en sers plus.

Pour ce qui est de ton code, c'est difficile de t'aider, on ne sait pas grand chose de ton projet et encore moins à quoi correspond le code que tu nous donnes.

"Afin de déterminée le chemin le moins cher que la tête de lecture puisse faire, je créer un arbre des chemins possible"
A priori faire un traitement exhaustif de tous les chemins possible est une mauvaise idée. Je ne sais pas trop quelle peut-être ta quantité d'information, mais ça ne m'étonne pas que tu obtiennes une erreur de mémoire. Et même si tu réussis à bien gérer la mémoire, tu auras sûrement ensuite un algorithme très long, car la combinatoire de ce genre de problèmes explose rapidement.

Essaye de nous expliquer le but de ton programme et l'algorithme que tu utilises, ce sera bien plus simple qu'un code Java partiel et sans explication.
0