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

  1. #1
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    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 chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    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
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    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 chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    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
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    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 sénior
    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
    Points : 23 190
    Points
    23 190
    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++

  7. #7
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    Par défaut
    Merci adiGuba.

    Un peu plus de précisions sur mon problème : j'analyse 4 différents algorithmes qui sont contenus dans mon jar et pour ces 4 différents algorithmes je lance une centaine d'expérimentations en faisant varier les différents paramètres.
    Je possède un script perl par algorithme qui fournit les paramètres pour lancer le jar.

    A l'heure actuelle j'utilise le -Xmx afin d'augmenter la taille de la jvm. Cependant mon plus gros algo me sort une exception avec 200go de ram (pas de ma faute c'est juste l'algo qui est con). Les autres algos utilisent moins. Mais afin de ne pas m'emmerder à chercher le seuil où ça passe j'ai fixé à 900go .

    Cependant j'utilise le même -Xmx pour tous les algos et toutes les expérimentations mais bien entendu en fonction des expérimentations je pourrais très bien diminuer très fortement ce nombre, mais si je le diminue et que mon expérimentation ne passe pas je perds trop de temps (45h pour mes plus grosses exécutions).

    Du coup afin de comparer ces algos (recherche) j'aimerai connaitre la quantité maximale de ram qu'ils consomment. C'est pour ça qu'une ligne bash serait parfaite.

  8. #8
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lovelace63 Voir le message
    Du coup afin de comparer ces algos (recherche) j'aimerai connaitre la quantité maximale de ram qu'ils consomment. C'est pour ça qu'une ligne bash serait parfaite.
    Ben le problème c'est que cette quantité dépend de la ram max... donc ca ne veut pas dire grand chose.

    Ton algo qui passe très bien avec -Xmx200g peut très bien utiliser le double de RAM si tu l'utilises avec -Xmx900g...


    a++

  9. #9
    Nouveau membre du Club
    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
    Points : 29
    Points
    29
    Par défaut
    C'est vrai que formuler comme cela ça pose problème.

    N'y a t'il pas un moyen de trouver la quantité minimale de ram qu'il me faut pour faire tourner mon programme (sans die and retry sur le Xmx)?

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