Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2550 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Java] Pbm gestion mémoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Java] Pbm gestion mémoire

n°1388675
placebomus​e2
Posté le 16-06-2006 à 10:00:37  profilanswer
 

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

mood
Publicité
Posté le 16-06-2006 à 10:00:37  profilanswer
 

n°1388692
Sebou77
French Tech powaa :-)
Posté le 16-06-2006 à 10:19:32  profilanswer
 

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

n°1388704
placebomus​e2
Posté le 16-06-2006 à 10:27:09  profilanswer
 

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....

n°1388827
Bidem
Posté le 16-06-2006 à 11:34:55  profilanswer
 

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

n°1388846
zapan666
Tout est relatif
Posté le 16-06-2006 à 11:42:36  profilanswer
 

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 !
n°1389026
placebomus​e2
Posté le 16-06-2006 à 14:33:30  profilanswer
 

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

n°1389070
frabill
Posté le 16-06-2006 à 14:56:16  profilanswer
 

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:

n°1389520
Taz
bisounours-codeur
Posté le 17-06-2006 à 03:01:21  profilanswer
 

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).

n°1392855
placebomus​e2
Posté le 22-06-2006 à 15:10:19  profilanswer
 

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 ?

n°1792779
Noizet
Posté le 27-09-2008 à 14:57:33  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Java] Pbm gestion mémoire

 

Sujets relatifs
applet java, ressource CPU, normal ?Java et fenêtre dos
Gestion des fenetresConnection à une BDD Openoffice, Java ou c# ?
[JAVA/Postgresql] Caractère d'échappement[JAVA/Postgresql] Caractère d'échappement
Outil GPL de gestion de conf de matérielnavigateur internet au sein d'une application Java
Est-il possible de créer une DLL C Sharp interopérable avec JAVA ?[SQL2000] processus sqlservr.exe utilise beaucoup de mémoire
Plus de sujets relatifs à : [Java] Pbm gestion mémoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR