[Java] Pbm gestion mémoire

Pbm gestion mémoire [Java] - Java - Programmation

Marsh Posté le 16-06-2006 à 10:00:37    

Bonjour,  
 
Je développe actuellement un programme Java qui permet d'effectuer une recherche dans des fichiers de plusieurs dizaines de milliers de lignes et affiche les lignes correspondant a un critère de recherche.
Tout fonctionne très bien a part au niveau de la mémoire : j'ai l'impression que le garbage collector ne fait pas son boulot. Du coup après quelques rercherches la mémoire sature et evidemment le programme se bloque.
J'ai truffé là ou il faut le programme de System.gc() et j'ai essayé d'augmenter l'espace mémoire avec Xmn512m par exemple mais en observant l'utilisation mémoire dans le gestionnaire des taches de windows, je me rends compte que du coup le garbage collector fait encore moins son boulot et occupe rapidement tout l'espace memoire alloué.  
En revanche si je ne precise pas l'espace memoire le GC travail comme il faut pour les fichiers de taille raisonnable.
Pour les très gros fichiers le GC est dépassé et l'espace mémoire aussi (mais c'est moins pire que si j'utilise Xmn512m).
 
Quelqu'un à une idée ?  
 
Par avance merci
 
Jo

Reply

Marsh Posté le 16-06-2006 à 10:00:37   

Reply

Marsh Posté le 16-06-2006 à 10:19:32    

ça vient peut être de ton algo de recherche qui est trop lourd nan ?

Reply

Marsh Posté le 16-06-2006 à 10:27:09    

l'algo est certe lourd car il stocke toutes les lignes (qui sont nombreuses) correspondant à la recherche dans un vecteur mais pas au point de demander plus de 500Mo de mémoire ! De plus toutes les variables temporaires sont déférencées et à chaque fois que l'utilisateur clique sur un bouton "reinitialiser" les objets stockant les lignes de résultat sont déférencés. Or, le gc ne libère absolument pas de mémoire....

Reply

Marsh Posté le 16-06-2006 à 11:34:55    

Le fait de faire un garbage collector ne diminuera jamais l'utilisation mémoire que tu vois dans les taches windows.
 
En fait il y a plusieurs notions à saisir
 - la mémoire réservé (c'est ça qu'on voit dans les tâcje windows)
 - la mémoire utilisée
 - la mémoire libre
 
La mémoire réservée ne diminue jamais, au lancement de la JVM, sa taille est initialisée à la valeur donnée par le parametre -Xms, puis elle grandi suivant les besoins de l'appli. Si sa taille atteint -Xmx, ça plante.
 
la mémoire utilisé, c'est la taille effectivement utilisée par l'appli, c'est ça qui diminue quand le garbage collector libère des objets
 
La mémoire libre est la différence entre les 2 premières
 
Mémoire libre = Mémoire reservée - Mémoire utilisé
 
Quand il n'y a plus de memoire libre, la jvm augmente la taille reservée (si on dépasse la valeur -Xmx, ça plante)
 
Donc si ton appli explose, c'est qu'elle utilise plus de 512 Mo de mémoire
 
Donne nous les erreures précise que tu reçois (stack trace) comme ça on verra mieux d'où ça peut venir
 
PS : j'espère que j'ai pas dis de conneries plus grosses que moi :p

Reply

Marsh Posté le 16-06-2006 à 11:42:36    

placebomuse2 a écrit :

l'algo est certe lourd car il stocke toutes les lignes (qui sont nombreuses) correspondant à la recherche dans un vecteur mais pas au point de demander plus de 500Mo de mémoire ! De plus toutes les variables temporaires sont déférencées et à chaque fois que l'utilisateur clique sur un bouton "reinitialiser" les objets stockant les lignes de résultat sont déférencés. Or, le gc ne libère absolument pas de mémoire....


Ca me fait pense a une boulette que j'ai fais la semaine derniere.
 
Pour afficher tous les vecteurs d'un coup de plusieurs objets, grosso modo, je mettais tous dans un vecteur :

Code :
  1. Vector v = MonObj.getVector();
  2. v.addAll(MonAutreObj.getVector());


J'affichais v une fois, 2 fois, etc, et mon appli bouffe aussi vachement beaucoup de memoire.... normal, le vecteur de MonObj augmente a chaque affichage...
 
J'ai resolu mon probleme :

Code :
  1. Vector v = new Vector();
  2. v.addAll(MonObj.getVector());
  3. v.addAll(MonAutreObj.getVector());


 
Ton cas, ce n'est peut etre ou peut etre pas ca :P


Message édité par zapan666 le 16-06-2006 à 11:42:49

---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 16-06-2006 à 14:33:30    

merci pour vos explications ;)
 
Le message que j'obtiens est le suivant :  
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
 

Reply

Marsh Posté le 16-06-2006 à 14:56:16    

Bidem a écrit :

Le fait de faire un garbage collector ne diminuera jamais l'utilisation mémoire que tu vois dans les taches windows.
 
En fait il y a plusieurs notions à saisir
 - la mémoire réservé (c'est ça qu'on voit dans les tâcje windows)
 - la mémoire utilisée
 - la mémoire libre
 
La mémoire réservée ne diminue jamais, au lancement de la JVM, sa taille est initialisée à la valeur donnée par le parametre -Xms, puis elle grandi suivant les besoins de l'appli. Si sa taille atteint -Xmx, ça plante.
 
la mémoire utilisé, c'est la taille effectivement utilisée par l'appli, c'est ça qui diminue quand le garbage collector libère des objets
 
La mémoire libre est la différence entre les 2 premières
 
Mémoire libre = Mémoire reservée - Mémoire utilisé
 
Quand il n'y a plus de memoire libre, la jvm augmente la taille reservée (si on dépasse la valeur -Xmx, ça plante)
 
Donc si ton appli explose, c'est qu'elle utilise plus de 512 Mo de mémoire
 
Donne nous les erreures précise que tu reçois (stack trace) comme ça on verra mieux d'où ça peut venir
 
PS : j'espère que j'ai pas dis de conneries plus grosses que moi :p


 
 
D'après ce que je sais, c'est bien ça.
 
Tu peux observer la mémoire libre (estimée) en utilisant des Runtime.getRuntime().freeMemory() bien placé dans ton code...
 
Ca m'est arrivé d'avoir ce genre de problème, l'utilisation mémoire explosait à cause d'une grosse liste d'objets que je trainais inutilement dans mes boucles  :whistle:

Reply

Marsh Posté le 17-06-2006 à 03:01:21    

si ton usage mémoire ne cesse d'augmenter c'est que tu as une bonne fuite de mémoire parce que tu gardes des références sur choses inutiles (comme par exemple tous les résultats de toutes les recherches effectuées).

Reply

Marsh Posté le 22-06-2006 à 15:10:19    

merci pour vos réponses !
 
Taz, impossible tout est déferencé a chaque fois.
 
En revanche voilà ce que j'ai remarqué : si pendant une recherche je m'amuse a minimiser et a maximiser la fenetre la liberation de mémoire s'effectue !  
 
Quelqu'un a une idée ?

Reply

Marsh Posté le 27-09-2008 à 14:57:33    

Hello,
 
As-tu trouvé une réponse ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed