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 :

Performance et memoire jvm


Sujet :

Java

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Par défaut Performance et memoire jvm
    Bonjour,

    J'ai un gros probléme de performance :

    J'ai un service web (en HTTP/xml) qui exporte des données de la base. Voici comment ça marche (en gros):

    - On fait appel au web service
    - Les données sont extraites de la base à l'aide d'hibernate (250 000 objets sont instanciées)
    - 250 000 nouveaux objets sont instanciées pour remplir les classes générés par jaxb (permet de générer automatiquement du XML à partir d'objets)
    - jaxb nous génére une string contenant le xml demandé (20 Mo)
    - La string est envoyée en réponse du service

    bon bref l'opération est trés lourde et utilise 300 Mo de mémoire dans la jvm. Les objets instanciés vont directement dans la old génération du heap et ne sont pas libérés à la fin de l'opération.

    Comment gerer ça ? faut t-il augmenter la taille de l'eden dans le heap ou modifier la configuration de la jvm ? Peut être déréférencé les objets "à la main"

    Quelles sont vos solutions sur ce genre de probléme ?

    Merci d'avance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Par défaut
    au niveau Hibernate, peut-être peux-tu détacher chaque objet de la session après utilisation pour qu'il soit garbage collecté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    session.evict(object);
    Après, jaxb garde-t-il une référence sur ces objets ?

  3. #3
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 111
    Par défaut
    je pense surtout que tu as gros probleme de conception.
    Oubli jaxB si tu ne peux pas annoter tes classes directement.

    Je pense qu'avec un iterateur sur les objects hibernate et que tu serialize puis envois directement dans un flux le resulat, tu aurais une solution qui ne couterait que quelques Mo en memoire et au moins une trentaine de fois plus rapide.

  4. #4
    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
    +1 n'essaie pas de garder tout en mémoire. Crée ta réponse au vol, petit bout par petit bout, ainsi tu n'aura normalement qu'un seul objet en mémoire à la fois.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Par défaut
    Merci pour vos réponses

    Effectivement eclesia tu as surement raison niveau conception c'est un peu foireux.

    En ce qui concerne les iterateurs je serais quand même obliger de charger mes 250 000 objets et de les instancier tous pour recuperer leurs contenus. Puis je quand même gagner en performance en utilisant les itetrateurs ?

    Au niveau de la serialization, si je comprends bien tu me conseille de serializer mon resultat et de l'envoyer directement dans le flux de reponse de service. C'est vrai qu'il n'y a aucune raison de le transformer en string. Par contre le xml à créer est un peu compliqué et grâce à jaxb j'ai juste besoin de mon xsd. Si je veux me passer de jaxb il faudrat que je créer mon xml "à la main", cela risque d'être long.

    Merci pour votre aide

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Par défaut
    Et en faites j'ai un notre probléme pour ecrire directement mon xml dans le flux de retour.
    j'ai besoin de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    out.write("<xml ....>");
    m.marshall(myObject, out);
    Le probléme c'est que si le marshaller plante, il y a deja un bout de parti dans le flux. Et si il y a plantage je voudrais envoyer un message complétement différent dans le flux (message d'erreur). c'est possible ?

  7. #7
    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
    alors tu va devoir tout garder en mémoire avant d'envoyer, et en assumer les conséquence!

Discussions similaires

  1. Memoire JVM et out of memory exception
    Par aelmalki dans le forum Général Java
    Réponses: 5
    Dernier message: 20/03/2010, 22h58
  2. Gestion de la memoire : JVM et windows
    Par biozaxx dans le forum Langage
    Réponses: 8
    Dernier message: 19/02/2008, 17h10
  3. augmenter la memoire jvm
    Par yamnetouaga dans le forum NetBeans
    Réponses: 1
    Dernier message: 24/09/2007, 11h47
  4. [Performance] La memoire n'est pas desalloulee
    Par sylvain_2020 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 18/11/2004, 10h30
  5. [JVM][Mémoire] Une erreur apparait suivant la plateforme
    Par Katyucha dans le forum Général Java
    Réponses: 9
    Dernier message: 17/11/2004, 21h00

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