Set, Map et Java heap space

Set, Map et Java heap space - Java - Programmation

Marsh Posté le 23-06-2010 à 10:55:40    

Bonjour,
 
 
J'ai un programme qui utilise beaucoup de mémoires, c'est normal mais depuis peu je rencontre un problème que j'ai du mal à cerner. J'ai quelques pistes ais un expert pourra peut être m'aider.
 

Citation :

java.lang.OutOfMemoryError: Java heap space
    at java.util.HashMap.resize(HashMap.java:462)
    at java.util.HashMap.addEntry(HashMap.java:755)
    at java.util.HashMap.put(HashMap.java:385)
    at java.util.HashSet.add(HashSet.java:200)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:305)
    at MON_SOURCE(file.java:116)


 
En gros la ligne 116 c'est :
 

Code :
  1. Set<String> set;
  2. Set<String> set2;
  3. ....
  4. set.addAll(set2);


 
Apparemment le Set utilise une hash pour gérer l'unicité des données. Lors de l'ajout d'un élément la hash est redimensionnée, elle doit être trop petite.
 
J'ai quelques idées :
- initialiser la hash table du set avec une plus grande valeur pour éviter le redimensionnement
- utiliser mon propre set -> cette idée n'est pas génial, on doit pouvoir s'en sortir avec le Set java
- augmenter la taille max du heap est hors de questions, elle est déjà bien grande.
 
Je vais continuer mes investigations mais si vous avez des idées merci de m'en faire part :)
 
 
edi ---  
arg je suis bête, je viens de voir que mon Set est construit avec "new HashSet<String>();"   :)


Message édité par ffomnislash le 23-06-2010 à 11:00:04
Reply

Marsh Posté le 23-06-2010 à 10:55:40   

Reply

Marsh Posté le 23-06-2010 à 11:23:51    

Ta 1ere idée (initialiser la hash table du set avec une plus grande valeur pour éviter le redimensionnement) ne changera rien, ton problème vient du fait que tu prend trop de mémoire pour Java. Donc soit tu augmentes le heap space soit tu te débrouilles pour compresser/limiter tes données en mémoire.

Reply

Marsh Posté le 23-06-2010 à 14:00:36    

Deamon a écrit :

Ta 1ere idée (initialiser la hash table du set avec une plus grande valeur pour éviter le redimensionnement) ne changera rien, ton problème vient du fait que tu prend trop de mémoire pour Java. Donc soit tu augmentes le heap space soit tu te débrouilles pour compresser/limiter tes données en mémoire.


 
Le redimensionnement ne résout pas mon problème effectivement (après test). Mon idée était d'éviter le redimensionnement qui je pense doit consommer un surplus de mémoire pendant l'opération.
 
Je vais essayer d'utiliser un autre set pour voir.

Reply

Marsh Posté le 23-06-2010 à 14:02:58    

Je vois pas bien pourquoi un autre Set règlerait le problème. Tout au mieux tu pourras insérer quelques éléments de plus mais tu vas vite arriver à la même chose.

Reply

Marsh Posté le 23-06-2010 à 14:08:53    

Deamon a écrit :

Je vois pas bien pourquoi un autre Set règlerait le problème. Tout au mieux tu pourras insérer quelques éléments de plus mais tu vas vite arriver à la même chose.


 
 
Un peu d'éléments en plus peut devenir beaucoup lorsque la JVM consomme 2go. Et je test le plus simple en premier.

Reply

Marsh Posté le 23-06-2010 à 14:29:31    

Par curiosité t'as quoi dans ta Collection qui pourrait consommer tant d'espace mémoire ?

Reply

Marsh Posté le 23-06-2010 à 14:50:52    

des String :)
 
je travail sur les logs de gros site bancaires certains jour ca explose.

Reply

Marsh Posté le 23-06-2010 à 14:52:25    

Et t'es obligé de stocker ça dans des objets Java ? Tu peux pas les écrire dans des fichiers ?

Reply

Marsh Posté le 23-06-2010 à 14:55:49    

Et filtrer en amont selon certain critères

Reply

Marsh Posté le 23-06-2010 à 15:27:49    

non mais il y a plein de filtres déjà. L'application est relativement bien foute.
 
Mais depuis quelque temps certains jours ca ne passe pas lors du calcul des visites ... pour lesquelles il est nécessaire de charger pas mal de choses.
 
Ceci dit je pense qu'il y a une problème quelque part.

Reply

Sujets relatifs:

Leave a Replay

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