IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Java.lang.outOfMemoryError : Java heap space


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut Java.lang.outOfMemoryError : Java heap space
    Bonjour !

    Je suis actuellement en train de réaliser un programme J2EE qui doit comparer les chaines d'une table A (155000 titres de film environ) avec celles d'une table B (19000 titres environ) via l'algo de Hamming et/ou Jaro Winkler.

    Le principe est que je charge la table A dans un HashSet et la table B dans un autre

    Lorsque je me contentais des titres et d'un numéro tout se passait bien, même si comme vous l'imaginez c'était très long (environ 8h45 ^^ )
    Maintenant j'ai modifié le programme pour qu'il affiche en plus du titre et de son numéro deux codes (1 chaine de 2 et 1 de 5 à 10 caractères) plus une date.

    Et là après une trentaine de secondes (je pense que c'est pendant le chargement des HashSet) Tomcat me récupère l'erreur :

    java.lang.OutOfMemoryError: Java heap space
    java.lang.StringCoding.set(StringCoding.java:53)
    java.lang.StringCoding.decode(StringCoding.java:171)
    java.lang.String.<init>(String.java:444)
    org.postgresql.core.Encoding.decode(Encoding.java:193)
    org.postgresql.core.Encoding.decode(Encoding.java:205)
    org.postgresql.jdbc2.AbstractJdbc2ResultSet.getString(AbstractJdbc2ResultSet.java:1861)
    org.postgresql.jdbc2.AbstractJdbc2ResultSet.getString(AbstractJdbc2ResultSet.java:2292)
    odax.servlet.CompChaine.doPost(CompChaine.java:139)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    Oups...

    Notez que là je viens de le relancer et il m'a seulement renvoyé

    java.lang.OutOfMemoryError: Java heap space
    Est ce que c'est comme il semble évident dû au chargement un peu brutal de données que je fait (plus assez de mémoire quoi...) ou est ce que c'est autre chose ?

    Dois-je remanier mon programme pour charger la table A en plusieurs fois ? Dans ce cas est ce que je laisse la connexion à la BDD ouverte pendant toute la durée du programme, ou est ce que j'en ouvre une à chaque fois que je souhaite recharger des données de la table A ?

  2. #2
    Membre éclairé Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Par défaut
    Tu peux déjà essayer d'augmenter la mémoire allouée à la JVM.

    Dans ton startup.bat de ton tomcat, tu met la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx1024m
    Ce qui alloue 1Go à ta JVM. Redémarre tomcat et réessaie...

    A+

  3. #3
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut
    Merci pour ta réponse. J'ai déjà vu ce genre de solution, mais dans est ce que ce n'est pas un peu de la bidouille ? Je m'explique : je suis en phase de test. Les tailles des tables collent actuellement avec le MINIMUM qu'on aura en prod. (Normalement la table A peut monter à 300000 titres et la B à 100000 )

    Et le client ne va pas acheter le dernier supercalculateur de NEC avec 1 milliard de milliard de flop

    J'aimerais votre avis là dessus : Est ce que ce n'est pas repousser le problème ?

    De plus 1Go de Ram c'est ce que j'ai sur mon serveur de test ^^

    Je viens de lancer le traitement en rajoutant LIMIT 50000 à la requête et ça semble tourner... ça va prendre environ 3H avant de terminer en principe ^^

  4. #4
    Membre éclairé Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Par défaut
    A mon avis, il te faut assez de mémoire pour stocker tes HashSet, donc tu es obligé d'avoir assez de Ram pour la JVM... Maintenant, si tu as besoin d'autant de mémoire alors que ce n'est qu'une "petite" base, c'est qu'il faut revoir ton programme... Essaie de charger qu'une partie de la base, puis la suivante... Ca devrait aller plus vite d'ailleurs...

    J'espère t'avoir aidé

    A+

  5. #5
    Membre éclairé Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Par défaut
    Oui c'est ce que je pense faire : charger la base par lot.

    Mais j'ai un doute à ce sujet. Est ce que je recrée une connexion à chaque changement de lot ou est ce que je laisse la première ouverte pendant toute la durée du traitement ?

  6. #6
    Membre éclairé Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Par défaut
    Je sais pas trop... Mais je dirais:
    Si tu es le seul à utiliser cette base, à la limite tu peux laisser la connexion ouverte... Mais sinon, ou si tu t'y connecte toutes les 30minutes (longs intervalles), tu peux la fermer...
    En gros y faut éviter de t'y reconnecter toutes les 5 secondes... je dirais...

    A+, et j'espère t'avoir aidé

Discussions similaires

  1. java.lang.OutOfMemoryError: Java heap space
    Par othmanbenhalima dans le forum Général Java
    Réponses: 12
    Dernier message: 08/01/2008, 17h46
  2. java.lang.OutOfMemoryError: Java heap space
    Par EvilAngel dans le forum Langage
    Réponses: 3
    Dernier message: 26/04/2007, 10h17
  3. [Findbugs] [Maven] java.lang.OutOfMemoryError: Java heap space
    Par albaille dans le forum Qualimétrie
    Réponses: 1
    Dernier message: 10/04/2007, 15h17
  4. Réponses: 4
    Dernier message: 18/09/2006, 10h02
  5. Eclipse erreur : java.lang.OutOfMemoryError: Java heap space
    Par sderecourt dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 14/04/2006, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo