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

Java Discussion :

[JVM] Mémoire maximum allouée différente de la mémoire maximum configurée


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Par défaut [JVM] Mémoire maximum allouée différente de la mémoire maximum configurée
    Bonjour,

    Je travaille sur un batch JAVA traitant des fichiers à volume important en entrée de traitement.
    Les fichiers en entrée deviennent de plus en plus gros et j'obtiens des outofmemory error (OutOfMemoryError: Java heap space).

    En local, j'ai pu augmenter la taille maximum de la JVM à 2Go via l'argument -Xmx2G
    Jusque là rien d'anormal, l'augmentation suffit à "corriger" le problème.

    Cependant, sur le serveur, l'erreur est toujours présente.

    J'ai donc fait une vérification de la mémoire utilisée par JAVA à l'aide de la méthode getHeapMemoryUsage() de la classe MemoryMXBean.
    En local, ça m'indique bien que la mémoire maximum allouée est de 2Go. Cependant, sur le serveur, elle est à 910,25 Mo.

    Comment cette différence est possible ? Est-ce qu'il est possible de configurer l'option ou un équivalent de Xmx ailleurs qu'au lancement de l'appli ? Par exemple mettre une taille maximum par instance ?

    M'enfin, si vous avez une réponse je suis tout ouïe.

    Et accessoirement, vous sauriez comment éviter de lire un fichier texte trop gros d'un seul coup (en gros, couper le readline() effectué pour chaque ligne du fichier afin de le lire en plusieurs fois ou au moins vider la mémoire toutes les 100 000 lignes par exemple) ?

    Si c'est pas clair ou qu'il manquerait des infos, n'hésitez pas à demander

    Merci !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Si vous avez cette valeur avant d'avoir le OOM, c'est vraissemblablement que le -Xmx n'a pas été pris en compte. Vérifiez que vous avez bien mi le paramètre au bon endroit. On n'a pas vos scripts sous les yeux.

    En cas de doutes, quand le serveur tourne, utilisez (si c'est un serveur unix) ps pour avoir la ligne de commande java utilisée. donnez nous la sortie de votre PS et ce que vous donne maximumHeapSize.

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Astemius Voir le message

    Et accessoirement, vous sauriez comment éviter de lire un fichier texte trop gros d'un seul coup
    Faites vos traitement ligne par ligne. readLine n'est pas en cause. A moins que vous ayez une ligne de texte sans retour à la ligne occupant 500M à elle seule, readline devrais vous convenir. Si vous continuer à consommer la mémoire, c'est que vous stockez ce que vous lisez quelque part en mémoire.

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Par défaut
    Alors,

    Quelques nouvelles, tu m'as ouvert les yeux. J'ai fait le test en diminuant la taille allouée, pour voir si ça transparaissait et effectivement, rien ne changeait au niveau du heap space affiché.

    Alors j'ignore si c'est moi ou un autre développeur mais pour le coup j'ia légèrement honte ^^' Le paramètre -Xmx était simplement situé au mauvais endroit (après l'appel au programme).

    Du coup merci beaucoup !

    Concernant la consommation de mémoire, effectivement, après une bonne sieste on voit mieux les choses et j'ai deux hashtable qui stockent diverses informations du fichier en entrée (pour chaque ligne et vu que ledit fichier en contient dans 1,5 million, j'imagine que les hashtable souffrent).

    Je vais tâcher de voir si y a pas moyen de repenser le traitement différemment.

    Merci de l'aide en tout cas.

    Edit : Du coup, vu que ce post n'apportera pas grand chose, vaudrait-il pas mieux le supprimer ?

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Astemius Voir le message
    Alors j'ignore si c'est moi ou un autre développeur mais pour le coup j'ia légèrement honte ^^' Le paramètre -Xmx était simplement situé au mauvais endroit (après l'appel au programme).
    Tu le passes comment ???
    Il faut qu'il soit présent avant le nom de la classe (ou le nom du jar principal). Sinon c'est un paramètre passé à ton programme et non pas à la JVM.


    Et la valeur par défaut du -Xmx peut varier selon plusieurs critères, comme l'OS, la mémoire disponible, le nombre de processeur...


    Citation Envoyé par Astemius Voir le message
    Concernant la consommation de mémoire, effectivement, après une bonne sieste on voit mieux les choses et j'ai deux hashtable qui stockent diverses informations du fichier en entrée (pour chaque ligne et vu que ledit fichier en contient dans 1,5 million, j'imagine que les hashtable souffrent).
    Il faudrait avoir un aperçut de ce que tu stockes, et comment tu le fait.




    a++

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Astemius Voir le message
    Edit : Du coup, vu que ce post n'apportera pas grand chose, vaudrait-il pas mieux le supprimer ?
    Non, ça me donne des points...

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Par défaut
    Oui en fait j'avais ça :
    /opt/jdk1.5.0_14/bin/java -cp conf:lib/moniteur.jar fr.moniteur.Main -Xmx2G

    Au lieu de ça, qui fonctionne nettement mieux ^^' :
    /opt/jdk1.5.0_14/bin/java -Xmx2G -cp conf:lib/moniteur.jar fr.moniteur.Main

    Pour le stockage des données, c'est juste un variable.put(toto, titi, tata)
    Et j'en ai deux qui se remplissent chacun d'autant de lignes qu'il y a dans le fichier.
    Mais en fait, dans mon programme, je pense savoir comment je pourrais éviter les problèmes de mémoire.
    Il y a 1,5 million de lignes dans le fichiers, soit 2 hashtable avec 1,5 million d'entrées.
    A côté de ça, y a une requête qui me renvoie 16000 enregistrements et pour chaque enregistrement, on rajoute dans un autre fichier (que nous appelleront fichier B) certaines données récupérées à l'aide de la requête et certaines données liées aux hashtables.

    Ne serait-il pas plus judicieux de récupérer le résultat de la requête à part, et de parcourir ensuite le fichier contenant les 1,5 million de lignes sans jamais enregistrer les valeurs des lignes dans les hashtables, et donc remplir le fichier B au moment du read ?

    Je sais pas si je suis bien clair ^^'

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Sans code ni explications précises ca risque d'être difficile de t'aider.


    Maintenant c'est sûr que si les fichiers sont énormes et que tu stockes tout en mémoire... Ben ca va consommer beaucoup de mémoire !


    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/04/2014, 13h05
  2. Réponses: 3
    Dernier message: 12/04/2014, 14h59
  3. Comment augmenter la mémoire vive allouée à Python?
    Par syrius31 dans le forum Général Python
    Réponses: 19
    Dernier message: 28/03/2011, 16h20
  4. Réponses: 17
    Dernier message: 25/03/2003, 13h45

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