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 :

Répartition de la mémoire Java


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de hasalex
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 879
    Par défaut Répartition de la mémoire Java
    Bonjour,

    Je suis en train d'essayer de comprendre comment est constitueé la mémoire d'un processus Java.
    Ce que j'avais compris, c'est qu'il y a la heap (commandée par -Xmx et -Xms), le perm space (commandé par -XX:MaxPermSize et -XXermSize ), le code cache (commandé par -XX:ReservedCodeCacheSize et -XX:InitialCodeCacheSize) et le stack par thread (commandé par -Xss et -XX:ThreadStackSize).

    A partir de là, je m'étais imaginer qu'en additionnant tout cela, je devais obtenir à peu de chose près la taille mémoire allouée au processus. Et bien non ! J'ai deux exemples, tous deux des applications Web, sous Tomcat 6, avec un JDK 6. Autant dans le premier cas, ça ne m'a jamais alerté, autant dans le deuxième cas, la différence est importante et peut me poser des problèmes.

    Premier cas :
    Sous Linux 32bits : heap=512Mo, Perm=256Mo, CodeCache=48Mo, StackSize=1Mo avec 21 threads
    Si j'additionne tout ça, j'obtiens 837Mo, alors que mon process utilise 873Mo.

    Deuxième cas :

    Sous Linux 64bits : heap + perm + code cache=4096 Mo, StackSize=1Mo avec 250 threads => 4350 Mo, et mon process utilise 1500 Mo de plus !

    De quel coté dois-je regarder pour trouver ce qui occupe mes 1500 Mo ? Si vous avez des pistes, merci...

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    La jvm alloue de la mémoire à l'avance, donc le processus prend plus de place que ce qu'il utilise vraiment.
    Tu peux voir cette différence avec un outil du genre jvisualvm (inclus avec le jdk depuis la version 1.6b10) qui permet de visualiser la mémoire.

    A plus

  3. #3
    Membre Expert
    Avatar de hasalex
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 879
    Par défaut
    J'ai peut-être raté quelque-chose avec jVisualVM, mais je ne vois pas comment explorer autre chose que la heap. Or, je n'ai aucun problème avec la heap.

    Peux-tu m'expliquer comment je dois procéder pour explorer ce qui n'est ni dans la heap, ni dans le perm space, ni dans les stacks ? Je suppose que ce qui reste est du ressort de librairies natives et de buffers avec l'OS, mais comment en savoir plus ?

  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
    Citation Envoyé par hasalex Voir le message

    De quel coté dois-je regarder pour trouver ce qui occupe mes 1500 Mo ? Si vous avez des pistes, merci...
    Est-ce que tu n'aurais pas utilisé, par hasard, cette commande pour mettre un stack de 1M?

    Car l'unité de base de ce paramètre est le kilobyte, en tappant 1M tu alloue alors 1024*1024 kilobyte par stack, ce qui donne 1G. J'ai essayé ici, avec 200 thread et ce paramètre, je monte bien à 204G de mémoire virtuelle pour le process sur système 64 bits.

    edit: pour les autre variation, ta mémoire peut etre occupée par les système suivant

    -> mappings dus à java.nio, ce mapping mémoire n'occupent pas de ram ni de place dans la JVM, a ce titre ils ne sont pas limités (c'est de la mémoire disque dur accessible via la zone mémoire du process, mais pas présent en RAM)
    -> données venant d'autre process et partagées. Ces données appartiennet peut etre aux autres process, mais comme le noyaux ne sais pas nécessairement qui en est propriétaire, ca apparait dans ta liste d'occupation. Exemple, les données partagées par l'interface graphique si tu utilise awt
    -> librairies de la jvm et nécessairement mappée en mémoire. Ca doit vaire une 20aine de M, qui sont alloués par l'OS avant le démarrage de la JVM et qui n'entrent pas en compte
    -> Donnée allouées par des librairies native. Si l'allocation se fait avec un malloc bien brut, la jvm n'a aucun controle dessus
    ->

  5. #5
    Membre Expert
    Avatar de hasalex
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 879
    Par défaut
    Non, il n'y a aucun problème de stack. J'ai d'ailleurs pu vérifier sa valeur (1024k) avec pmap.

    Ce qui me tracasse, c'est ce qu'il y a à coté des zones classiques (heap, stacks, perm, code cache). Je suppose qu'il s'agit de mémoire utilisée par des librairies native ou des buffers avec l'OS. Mais comment en savoir plus ?

  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
    quelle mesure de mémoire utilise-tu? Rien qu'avec top, il y a déjà 3 colonne concernant la mémoire.

  7. #7
    Membre Expert
    Avatar de hasalex
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 879
    Par défaut
    Je parle de Virtual Mémory. En effet, c'est celle-ci que peut poser des problèmes de limitation au niveau de l'OS. Une bonne partie de la différence entre virtuelle et résidente vient du fait que Xmx > Xms et MaxPermSize > PermSize.
    pmap m'indique que presque toute la mémoire inconnue est résidente.

  8. #8
    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
    as-tu vérifié la mémoire réellement utilisée avec

    cat /proc/<pid>/status


    La colonne VIRT dans top n'est qu'un information sur l'espace d'adressage utilisée par l'application, ca n'a rien a voir avec la mémoire qu'elle a réservé et n'est pas un indication des besoins en mémoire de ton application. Si je crée en C un application qui est capable de travailler avec 100k de mémoire mais qui fait un mmap de 5 fichier de 100G, je vais avoir un VIRT qui dépasse alègrement les 500G.

    Il 'suffit' que t'ai 1 page de donnée mappée dans la zone d'adressage de 16G, par exemple, avec un gros trous de 15,99G entre celle-ci et la base de ton programme, pour que la colonne VIRT de ton process donne 16G.


    Je parviens, sans problème ici, à faire grimper le VIRT d'un JVM (ok, je pousse le bouchon mais bon) à 2.5 tera de mémoire, et pourtant, comme une grande, la JVM lance des out of memory exceptions dès que j'atteinds les 512M autorisés par ses commandes, sans vraiment requérir de mémoire du système.

    Bref, la colonne VIRT n'est certainement pas à prendre en compte pour mesurer les besoin d'une application (quelle soit java ou autre). La mesure la plus proche se situe dans la zone [RES-SHR,RES] quand tu n'a pas de swap.

    Et la différence VIRT / RES n'est absolument pas liée à la différence permsize/maxpermsize, heapsize/maxheapsize, car cette gestion est inconnue de l'os, c'est la jvm qui alloue ou pas des segment de mémoire en fonction de la charge via des appels realloc()


    Il y a plein de chose qui peuvent augmenter l'espace d'adressage dans une application, sans pour autant nécessiter de la RAM, car plein d'opération système se font sur base de pages d'adresses (accès à des périphérique, accès plat à des fichiers, accès à des ressources partagée, communications inter process, etc).

Discussions similaires

  1. Problème mémoire java
    Par donnadieujulien dans le forum Général Java
    Réponses: 9
    Dernier message: 12/09/2008, 10h54
  2. Augmentation de mémoire Java.
    Par vincevince dans le forum Général Java
    Réponses: 5
    Dernier message: 22/07/2008, 10h31
  3. Fuite Mémoire JAVA
    Par StePhAngel06 dans le forum JDBC
    Réponses: 20
    Dernier message: 10/12/2007, 14h03
  4. probleme de mémoire : Java heap space
    Par Seb33300 dans le forum Interfaces Graphiques en Java
    Réponses: 10
    Dernier message: 21/02/2007, 13h40
  5. Gestion de Mémoire Java
    Par lebulls dans le forum Langage
    Réponses: 5
    Dernier message: 18/07/2006, 10h35

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