Blocage puis le message d'erreur java.lang.OutOfMemoryError [Résolu/Fermé]

Signaler
Messages postés
45
Date d'inscription
dimanche 19 août 2012
Statut
Membre
Dernière intervention
6 décembre 2012
-
Messages postés
45
Date d'inscription
dimanche 19 août 2012
Statut
Membre
Dernière intervention
6 décembre 2012
-
Bonjour,

lors de l'exécution de mon programme( il sagit un nouveau algorithme evolutionnaure basé sur un nombre elevé des generations) , il ya toujours ub blocage dans une des generations.apres ce message s'affiche:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
[java] at java.util.Arrays.copyOf(Unknown Source)
[java] at java.util.Arrays.copyOf(Unknown Source)
[java] at java.util.ArrayList.grow(Unknown Source)
[java] at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
[java] at java.util.ArrayList.add(Unknown Source)

j'ai essayé plusieurs solutions proposées sur le net mais le meme souci persiste encore.Qu'est ce que je dois faire ??

1 réponse

Messages postés
1491
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
83
Bonjour asmakalboussi,
Probablement un problème de dépassement de tableau.
Soit il n'y a pas assez de mémoire pour mettre l'ensemble du tableau (cela ne se passe plus depuis que nous avons des giga octets en ram), ou tu demandes à ton tableau un élément qui n'est pas en mémoire (très souvent !).
Ton tableau contient 11 élément : t(10) ; de zéro à 10, cela fait bien 11 élément.
Tu demandes d'afficher t(11) :: erreur, dépassement.
Si ce n'est pas cela, sans voir le code, c'est très difficle.
Messages postés
1491
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
83
Tu n'as pas un débugger dans ton programme Java, car là, c'est beucoup et je ne suis pas un spécialiste non plus !
Peut-être quelqu'un d'autre ?
Messages postés
45
Date d'inscription
dimanche 19 août 2012
Statut
Membre
Dernière intervention
6 décembre 2012

oui j'ai un débug mais il prend enormement de temps :(
Merci en tout cas
Messages postés
1491
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
83
Je te demande de penser à ceci:
Une machine (ordinateur) est bête, elle ne sait lire et écrire que des zéros et des un, mais elle travaille beaucoup plus vite que nous.
Donc, fait faire le travaille par ton débogueur, et si tu ne trouves pas, la communauté de "Comment ça marche" se fera un plaisir de t'aider.
Donc ferme ce sujet, et quand tu as trouvé l'erreur précise, reviens nous voir. ok ?
Messages postés
16040
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 septembre 2020
2 679
Le problème de OutOfMemoryError c'est que ça ne correspond pas à une ligne en particulier, c'est qu'à force de faire des copies de tableaux (java.util.Arrays.copyOf), la mémoire est saturée.
Ça plante ici mais ça pourrait planter n'importe où. Le problème est bien plus profond que ça vu qu'il faudrait revoir tout l'algorithme pour diminuer la consommation de mémoire.
Après, je pourrais toujours proposer quelques améliorations ponctuelles, mais ça ne corrigera pas significativement le problème.

Exemple d'amélioration, au lieu de faire ça :

List<Chargingstation> availableCharginstation = new ArrayList<Chargingstation>();
for(Chargingstation C: charge ){
availableCharginstation.add(C);
}

Tu peux faire directement ça :
List<Chargingstation> availableCharginstation = Arrays.asList(charge);
C'est plus efficace et ça nécessite moins de mémoire intermédiaire vu que la liste n'as pas à être redimensionné au fur et à mesure (java.util.ArrayList.ensureCapacityInternal).

Mais ce n'est qu'une amélioration minime, la vraie question serait de savoir pourquoi tu as besoin d'avoir deux fois ces informations : une fois avec le tableau, et une fois avec la liste. Chaque information est en double, et si ces méthodes sont récursives, forcément ça explose ! Il faut tout revoir...
Messages postés
45
Date d'inscription
dimanche 19 août 2012
Statut
Membre
Dernière intervention
6 décembre 2012

Merci KX :)
je fais essayer d'ameliorer mon code tout de suite . tu as raison