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 :

Question Ram utilisée programme/JVM


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 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Par défaut Question Ram utilisée programme/JVM
    Bonjour à tous,
    Depuis ce matin, j'essaye de mesure la quantité de ram qu'utilise mon programme. En suivant la faq je suis tombé sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.out.print("Ram used in JVM: " + memoryBean.getNonHeapMemoryUsage());
     
    System.out.println("Ram used in app: " +  memoryBean.getHeapMemoryUsage());
    Si j'ai bien compris :
    - la 1ère ligne permet de mesurer la quantité de ram qu'utilise la jvm.
    - la 2nde permet de mesurer la quantité de ram qu'utilise mon application.

    Mais quand je regarde les résultats j'obtiens ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ram used in JVM: init = 24313856(23744K) used = 38663872(37757K) committed = 80019456(78144K) max = 224395264(219136K)
    Ram used in app: init = 129210112(126181K) used = 13258216(12947K) committed = 123863040(120960K) max = 1838088192(1795008K)
    J'ai remarqué que la jvm initialise moins de ram que mon application. Du coup en relisant la doc, j'ai cru comprendre que la 1ère ligne correspond en fait à juste la jvm sans l'application.
    Du coup si je veux la mémoire nécessaire pour exécuter mon programme il faut que je fasse la somme des deux? juste la somme des used?

    Maintenant supposons que la somme des used est égale à 1go et que le commited est égal à 2go. Que va t'il se passer si je change de pc et que mon nouveau pc n'a que 1.5go de ram, le programme va t'il pouvoir s'exécuter?

    Bonne journée

  2. #2
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par lovelace63 Voir le message
    Si j'ai bien compris :
    - la 1ère ligne permet de mesurer la quantité de ram qu'utilise la jvm.
    - la 2nde permet de mesurer la quantité de ram qu'utilise mon application.
    C'est plus compliqué que ca. Certaines informations sont stockées dans le heap, d'autres ailleurs (non-heap). Par exemple, les constantes ou le code des classes sont stockés dans le non-heap. Plus d'infos ici :
    http://docs.oracle.com/javase/7/docs...oryMXBean.html

    Citation Envoyé par lovelace63 Voir le message
    J'ai remarqué que la jvm initialise moins de ram que mon application. Du coup en relisant la doc, j'ai cru comprendre que la 1ère ligne correspond en fait à juste la jvm sans l'application.
    Du coup si je veux la mémoire nécessaire pour exécuter mon programme il faut que je fasse la somme des deux? juste la somme des used?
    Pour savoir quelle est la quantité de mémoire en cours d'utilisation, il faut sommer les 2 used.
    Plus d'infos ici :
    http://docs.oracle.com/javase/7/docs...moryUsage.html

    Citation Envoyé par lovelace63 Voir le message
    Maintenant supposons que la somme des used est égale à 1go et que le commited est égal à 2go. Que va t'il se passer si je change de pc et que mon nouveau pc n'a que 1.5go de ram, le programme va t'il pouvoir s'exécuter?
    Deja, il faut comprendre que la machine virtuelle recupere de la mémoire lorsqu'elle en a besoin et ne la libere pas forcement tout de suite apres qu'elle ne soit plus utile. La memoire committed correspond donc a la mémoire qu'à pris la JVM et la mémoire used à celle actuellement utilisée. On ne peut donc pas savoir si sur le PC avec 1.5Go l'application marchera mais ce n'est pas du tout impossible car la RAM sera mieux gérée sur un PC qui en a moins. Il faudrait tester...

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Par défaut
    Merci pour ta réponse hwoarang.

    Pour savoir quelle est la quantité de mémoire en cours d'utilisation, il faut sommer les 2 used.
    Au début j'ai cru que le used retournait la mémoire maximale qui va être utilisée (et nécessaire) pour lancer le programme.
    Mais en fait c'est la mémoire à l'instant i, et ce n'est pas de dont j'ai besoin.

    Mon problème : dans un script perl j'ai des boucles qui me permettent d'itérer mes expérimentations. A la fin de ce script après avoir récupérer mes paramètres dans les boucles je lance un jar avec les bons paramètres. Mon objectif est de voir la différence de consommation de mémoire entre ces différentes expérimentations. J'ai donc besoin de connaitre la quantité maximale de mémoire que mon problème va nécessiter.

    Comment puis je faire pour résoudre mon problème? Il y a t'il une méthode java qui me retourne la quantité max de ram utilisée pour l'exécution?

  4. #4
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Pour ce genre de cas, le mieux, à mon avis, est d'utiliser un profiler comme JVM Monitor (si tu utilises eclipse). Comme ca, tu pourras avoir une courbe de la consommation mémoire et avoir une idée de ce que ton appli consomme. Bien sur, apres avoir lancé le profiler, il faudrait faire les actions qui sont sensées consommer le plus de mémoire...

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Par défaut
    Ok merci.
    Je ne lance le programme via Eclipse que sur des petits exemples pour le dév.
    Mais je lance mes expérimentations sur un serveur afin d'avoir assez de puissance de calculs.

    Et en bash il n'y a aucune commande pour regarder le pic de consommation de ram?

  6. #6
    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 lovelace63 Voir le message
    Et en bash il n'y a aucune commande pour regarder le pic de consommation de ram?
    Aucune idée, mais je sais que des outils comme VisualVM (fourni dans le SDK d'Oracle) peuvent monitorer des applications Java sur des serveurs distants (par contre je ne sais plus comment il faut faire).



    Toutefois cela ne signifie rien quand à la mémoire minimum requise par ton programme. Pour cela tu dois obligatoirement jouer avec -Xmx en diminuant les valeurs.


    En effet selon la configuration, le GC peut être plus ou moins "gourmand".
    Si le -Xmx est important, le GC va pouvoir "consommer" plus de mémoire, et donc retarder la libération des objets. C'est plus gourmand en RAM, mais cela permet d'améliorer les performances (libération groupé)

    A l'inverse avec un -Xmx réduit, le GC va avoir tendance à libérer la mémoire plus souvent, ce qui induit une consommation moindre mais des performances moins élevés...

    Bref la consommation peut varier selon divers critères, et ce n'est pas parce qu'elle utilise 1Go sur une machine, qu'elle nécessitera forcément cette quantité de mémoire pour fonctionner normalement...

    a++

Discussions similaires

  1. [Plone / Zope / Apache] question d'utilisation
    Par sebb84 dans le forum Zope
    Réponses: 6
    Dernier message: 18/12/2006, 22h38
  2. Question sur utilisation du JOIN LEFT ON
    Par carolinebelle dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/07/2005, 13h57
  3. Questions sur la programmation objet en Delphi
    Par Manopower dans le forum Débuter
    Réponses: 20
    Dernier message: 15/06/2005, 15h39
  4. Questions sur la programmation Api de windows
    Par ApolloCrid dans le forum MFC
    Réponses: 7
    Dernier message: 22/02/2004, 01h43

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