Les Allergies
Alimentaires
Posez votre question Signaler

Java.lang.OutOfMemoryError: Java heap space [Résolu]

dev_man 35Messages postés 30 octobre 2011Date d'inscription 23 mai 2012Dernière intervention - Dernière réponse le 25 janv. 2012 à 15:35
Bonjour tout le monde,
je rencontre un probleme lors de l'affichage d'un grand nombre d'enregistrements dans jtable.
l'erreur rencontré est la suivante :
Exception in thread "Thread-3" java.lang.OutOfMemoryError: Java heap space
at java.util.Vector.<init>(Vector.java:111)
at java.util.Vector.<init>(Vector.java:124)
at java.util.Vector.<init>(Vector.java:133)
..........
..........
..........
Veuillez m'aider svp.
Lire la suite 

Java.lang.OutOfMemoryError: Java heap space »

12 réponses
Réponse
+0
moins plus
Ta machine virtuelle n'a pas suffisamment d'espace pour toutes les données que tu rentres, cela peut-être dû à une mauvaise configuration.
Tu peux utiliser l'option -Xmx pour définir la taille maximale à donner à la JVM.
Par exemple -Xmx256m lui attribuera 256 Mo de mémoire.

Si tu as toujours des problèmes, il va falloir optimiser ton programme pour limiter l'espace perdu, mais là ça va être une autre paire de manches !
Ajouter un commentaire
Réponse
+0
moins plus
Merci Pour ta réponse, pour te dire j'ai dèja effectué cette configuration et j'ai alloué davantage pour mon programme mais malheureusement toujrs je rencontre le même problème.

à savoir que j'essaye d'amener 800 000 enregistrements, tu peux me conseiller une piste ?
KX- 24 janv. 2012 à 13:37
Afficher 800 000 éléments dans une JTable en même temps c'est énorme.
Imagine ce que dirait ton navigateur web si Google te donnait sur la même page les 800 000 premiers résultats de sa recherche !!! Il vaut mieux réfléchir en pages comme il le fait.
Une page affiche 100 résultats par exemple, et tu te déplaces de pages en pages pour trouver ce que tu veux... Ou alors un menu déroulant où quand tu descends ça "désaffiche" la première ligne pour tout décaler et afficher la dernière (inversement si tu remontes).
Ajouter un commentaire
Réponse
+0
moins plus
Le probleme c'est que l'utilisateur peut exporter les données contenues dans le Jtable vers un fichier Excel, Dans ce cas la comment il peut les exporter on utilisant la méthode en page.
KX- 24 janv. 2012 à 16:31
L'affichage c'est une chose, mais le stockage des données en est une autre.
Normalement tu devrais avoir quelque part tes 800 000 éléments (dans une liste, un vecteur... ou une collection un peu plus évoluée) que tu affiches page par page, mais lorsque tu fais ton exportation peu importe ce qui est affiché, tu iras lire directement dans ta collection, pas dans ton interface graphique !
Ajouter un commentaire
Réponse
+0
moins plus
Oui je te comprends, mes données sont toutes stocké dans un vector et à partir de ce vecteur que j'affiche le resultat dans le jtable, le hic c'est que j'arrive pas à detecter à quel point je me bloque . est ce lorsque j'allimente mon jtable ou lors de de stockage dans le Vector ?
KX- 24 janv. 2012 à 17:01
Normalement le stockage dans le Vector devrait supporter les 800000 éléments, mais ça dépend bien sûr de la taille en mémoire de chacune des données, si tu es de l'ordre du Ko ça risque de coincer selon les performances de ta machine, mais si c'est juste quelques dizaines d'octets (quelques entiers et quelques String par exemple) ça va passer.
Le problème c'est au moment de l'affichage, parce que chaque élément est associé à une case, et à des évènements (je clique dessus, je sélectionne la case, etc...) et que toutes ces données supplémentaires augmentent considérablement le poids en mémoire de chaque élément affiché, et c'est pour ça qu'il faut restreindre à un petit nombre d'éléments affichés (une centaine maxi), en plus ton application sera plus fluide que si elle doit synchroniser l'affichage des 800000 éléments.
Mais comme tu n'as pas du tout expliqué ce que tu faisais exactement, je peux difficilement t'orienter mieux. Mais par exemple il faut savoir que Vector est plus lourde à manipuler qu'une ArrayList qui fait la même chose (dans un contexte monothread) et qu'une LinkedList est encore plus légère en mémoire, même si du coup les temps d'accès des méthodes sont différents, tout dépend de ton traitement.
Ajouter un commentaire
Réponse
+0
moins plus
Ce que je fais est tres simple, je recupere les données depuis une base de données et les afficher dans un jtable, il s'agit des données d'une année toute entiere qui doivent etre affiché pour l'utilisateur et qu'il peut les exporter sous un format excel.
Ce que je comprend depuis ton intervention que :
1 - je dois mettre en place un affichage en page
2 - exporter les données pt importe l'affichage dans la base de données.

La choses un peu etrange aussi que lorsque je travail sous Sql developer (outil d'oracle) ca me permet d'extraire un maximum de données (mais il a aussi des limite) il est aussi developpé avec java.

Merci bcp KX. (et si t'as un exemple de l'une de tes appli qui fonctionne en page ca se sera tres interessant).
KX- 25 janv. 2012 à 11:27
Si tu as une base de données, pourquoi est-ce que tu stockes tes résultats dans un vecteur ?
J'avoue que question BDD je suis un peu rouillé mais ne pourrais-tu pas directement stoker les résultats de ta recherche dans ta base de données pour ensuite aller chercher 100 par 100 à l'affichage (rajoute juste un bouton plus et un bouton moins pour te déplacer d'une page à la suivante) ou la consulter itérativement pour l'enregistrement du fichier CSV mais sans avoir à copier tes 800000 résultats dans ton programme Java...
Ajouter un commentaire
Réponse
+0
moins plus
J reformule ta réponse, j'interorge la base de données je recupere mon resultSet qui contient tous les enregistrements (800 000) j'ajoute au fur et à mesure les 100 enregistrements dans un vector tant que l'utilisateur le demande(bouton plus). c'est exactement ce que tu propose ?
KX- 25 janv. 2012 à 15:27
Je ne sais pas trop comment fonctionne le ResultSet, savoir si il copie tous les résultats où si ça ne fait que pointer vers la base de données, mais dans ce cas oui c'est ce que je dis. À partir de ton resultSet n'en afficher qu'une petite partie à chaque fois (100 par exemple), et à la demande afficher les 100 suivants ou les 100 précédents. Et pour le fichier CSV prendre le resultSet dans son intégralité mais sans restocker tout dans un vector pour autant, directement de la base de donnée au CSV.
Ajouter un commentaire
Réponse
+0
moins plus
Merci infiniment KX, pour l'objet resultSet : il contient le jeu d'enregistrement ramené par l'interogation SQL, il contient l'integralité des enregistrements.

Ca me reste qu'implementer un code qui correspond à ta suggestion.
je te souhaite une tres bonne journée.
Ajouter un commentaire
Ce document intitulé « java.lang.OutOfMemoryError: Java heap space » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?