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 mémoire JVM


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Par défaut Performance mémoire JVM
    Bonjour à tous,

    je travail sur une application de dessin en Java/Swing qui permet, entre autres, d'exporter en PDF (grâce à iText) le canevas réalisé. Mais j'ai des difficultés à gérer efficacement ma mémoire.

    Déjà, voilà ce que je comprends de la mémoire. Arrêtez-moi si je me trompe. Pour chaque zone de la mémoire (Eden and Tenured) il y a :

    • La mémoire utilisée (used) réellement consommée par la JVM ;
    • La mémoire réservée (comitted) elle est extensible et empiète au besoin sur la partie "virtual". C'est la mémoire que semble voir le gestionnaire de tâches sous windows par exemple ;
    • La mémoire maximale (max) pouvant être utilisée. Au délà => Java Heap Space error :-)


    Le problème que je rencontre concerne la mémoire réservée "committed" parce qu'elle s'étend si j'en besoin, mais ne se réduit pas quand on je n'en ai plus besoin.

    En temps normal mon application consomme peu de mémoire, mais ponctuellement lors de l'export en PDF, la mémoire réservé peut atteindre 300 ou 400Mo et ne redescend pas une fois l'action terminée, bien que la mémoire utilisée (used) retombe à moins de 10Mo :

    Nom : Image1.gif
Affichages : 162
Taille : 8,8 Ko

    Ce qui fait que, dans le gestionnaire de tâches de Windows, mon appli commence à 10Mo de RAM et se termine à 450Mo... Pas terrible !

    Savez-vous comment gérer la mémoire de manière à ce que la partie réservée de l'Eden ou du Tenured s'étende et se réduise en fonction des besoins de l'appli ?

    De manière général, c'est un topic de discussion sur la gestion et l'optimisation de la mémoire avec Java.

    Merci de vos avis éclairés

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Pour avoir il y'a 1 mois jouer avec iText pour generer des PDF, je px dire que je montait parfois a 750Mega juste pour generer le PDF... apres je ne comprends pas vraiment ta question en fait. Une fois que tu as generé ton PDF en theorie, la mémoire devrait redescendre ou au moins pouvoir reservir).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Par défaut
    Bah théoriquement oui, elle devrait redescendre. D'ailleurs la mémoire utilisée redescend, mais la mémoire réservée augmente et ne redescend pas. Mais peut-être que ce n'est pas un problème...

    Concernant iText, je suis d'accord. J'ai du mal à saisir pourquoi il prend autant de mémoire pour exporter un petit dessin... Peut-être que mon algo n'est pas bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(this.file));
    document.open();
    PdfContentByte cb = writer.getDirectContent();
     
    // Drawing the page border
    Graphics2D g2d = cb.createGraphics(pageHeight, pageWidth);
    g2d.drawRoundRect(20, 20, (int)pageHeight-40, (int)pageWidth-40, 20, 20);
    g2d.dispose();
     
    // Inserting the capturedImage
    Image image = Image.getInstance(this.controller.getCapturedImage(), null);
    document.add(image);
     
    document.close();
    writer.close();

  4. #4
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    Ce que tu constates est juste, la JVM ne désalloue jamais de mémoire. Quel intéret aurait-elle à cela d'ailleurs étant donné qu'elle risquerait fort de devoir réallouer cet espace lors d'une prochaine action.?
    Si tu ne veux pas allouer beaucoup de mémoire mets un -Xmx faible et laisse le GC bosser davantage.

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Par défaut
    Je suis d'accord avec toi et je réduirais bien la taille maximale du heap (-Xmx). Cela conviendrait à 95% des cas d'utilisation de mon application.

    Seulement, de temps en temps, mon appli a besoin de beaucoup de mémoire. Alors comment faire ? C'est dommage de réserver tout cet espace pour ne l'utiliser que dans 5% des cas !

    En fait, j'ai remarqué que ma consommation de mémoire retombe après avoir réduit ma fenêtre principal ; comme s'il fallait réinitialiser l'IHM. J'ai donc trouvé une astuce : après avoir exporté mon PDF, je réduis ma fenêtre et ouvre le PDF fraichement généré... Pendant ce temps, ma JVM se purge !

    J'ai participé à une formation Delphi la semaine dernière et j'ai retrouvé avec horreur les "pointeurs". Avec horreur, mais aussi avec plaisir car j'ai appris des tas de trucs sur la gestion de la mémoire.

    Le GB de java est génial, mais je trouve qu'il manque de flexibilité, en particulier, dans le cas de grosses opérations, j'aimerais pouvoir allouer et désallouer à la main un certain espace de mon heap.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par DaveRidic Voir le message
    Je suis d'accord avec toi et je réduirais bien la taille maximale du heap (-Xmx). Cela conviendrait à 95% des cas d'utilisation de mon application.

    Seulement, de temps en temps, mon appli a besoin de beaucoup de mémoire. Alors comment faire ? C'est dommage de réserver tout cet espace pour ne l'utiliser que dans 5% des cas !

    En fait, j'ai remarqué que ma consommation de mémoire retombe après avoir réduit ma fenêtre principal ; comme s'il fallait réinitialiser l'IHM. J'ai donc trouvé une astuce : après avoir exporté mon PDF, je réduis ma fenêtre et ouvre le PDF fraichement généré... Pendant ce temps, ma JVM se purge !
    Tout cela est inutile. Si la fonction est utilisée une fois, elle sera utilisée deux fois, puis trois, et aussi longtemps que le programme ne sera pas arrêté : le programme a été démarré pour elle, et a donc besoin de cette mémoire.

    Si elle n'est pas utilisée, l'espace mémoire n'est pas réservé, et la question ne se pose pas.

    Citation Envoyé par DaveRidic Voir le message
    Le GB de java est génial, mais je trouve qu'il manque de flexibilité, en particulier, dans le cas de grosses opérations, j'aimerais pouvoir allouer et désallouer à la main un certain espace de mon heap.
    C'est souvent à tort. Pas toujours, non, mais souvent. Dans l'exemple donné au-dessus, cela t'aurait permis un chtit mieux. Un petit pas grand-chose, qui aurait fait plaisir aux rares personnes qui surveillent l'utilisation mémoire de leurs programmes sans vraiment comprendre, et qui auraient pu constater que son utilisation diminue quand il n'est pas juste en train de faire quelque chose.
    C'est très souvent comme ça.

    Une gestion fine de la mémoire, c'est nécessaire dans des cas précis, mais pas courants.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. mémoire jvm & config JBoos
    Par geforce dans le forum Wildfly/JBoss
    Réponses: 0
    Dernier message: 26/09/2013, 21h01
  2. Optimiser performance mémoire --> XML vs Vector
    Par vanhel dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 15/03/2010, 09h41
  3. probleme performances sous JVM server mode
    Par biozaxx dans le forum Langage
    Réponses: 1
    Dernier message: 17/12/2009, 09h43
  4. Performance entre JVM 1.4 et JVM 1.5
    Par boutss dans le forum Langage
    Réponses: 3
    Dernier message: 20/09/2007, 10h37
  5. Taille mémoire JVM
    Par javaDev dans le forum Général Java
    Réponses: 3
    Dernier message: 15/03/2006, 17h52

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