• Home
  • About
    • Ahmed DAMMAK photo

      Ahmed DAMMAK

      Full Stack Developer

    • Learn More
    • Twitter
    • LinkedIn
    • Github
  • All Posts
  • All Tags
  • Projects

DevoxxFR 2019 - Inside the JVM

19 Apr 2019

Reading time ~2 minutes

Talk de Sylvain Wallez @bluxte, Tech Lead Cloud, Elastic.

Abstract

Suivez le lapin blanc ! Comment passe-t-on de votre code Java à l’assembleur qui le fait fonctionner ? Manipuler des concepts de haut niveau nous a fait oublier ce qui se passe “sous le capot”, qui est pourtant une des clés pour écrire du code efficace. A partir de quelques lignes de Java, nous partirons en exploration dans les différentes couches qui participent à l’exécution de votre code : compilateur, byte code, structure de la JVM OpenJDK, JIT, HotSpot, méthodes intrinsèques, assembleur généré… Une présentation de vulgarisation accessible à tous, dont l’objectif est de susciter votre curiosité pour que vous aussi, vous partiez en exploration !

Notes

Blog Client couch base : JVM profiling - Lessons from the trenches

Dans la méthode Enulm.values() —> on alloue bq de mémoire

On rajoute une première optima :

  • Fast path of common values

Profiling mémoire :

  • l’utilisation de la mémoire
  • Mémory leak
  • Pression sur le GC (objet avec durée de vie très faible)

Pour voir ce qui se passe sur la JVM :

  • Profiler
  • jmap -histo $numero_process

Pour voir les objet en vie -histo:live (perform GC first)

Tools :

  • Java Mission Control :
  • Free a partir de JDK 11
  • Java fight recorder :
  • Agent de monitoring léger qui fait de l’échantillonnage
  • Tracker l’origine des allocation mémoire
  • Activité GC

Optim 2 : Sortir la méthode values() dans une constante

  • Pas de charge Mémoire
  • Pas de charge GC

WeakReference dégagent quand on a des Full GC

Outil java -c —> affiche le byte code

On voit dans le byte code qu’on fait un clone au niveau de la méthode values() pour créer une copie défensive.

Constant pool :

  • c’est un graph
  • Des objets qui ont un type
  • Des chaines de caractère UTF 8

Interprétation du langage

  • [ —> array
  • L<> : class name
  • IJSBC ==> types primitif
  • F,D : Float Double
  • Z -> boolean
  • v -> void

JMH

  • outil de benchmark
  • Projet openJDK

Solution 3 : Prépare lookup array

Dangers JMH :

  • bien trouver le niveau d’optim
  • Optimiser que le hot path
  • Ca prend bq de temps

Méthodes intrinsic

  • macro C++ dans tous les sens
  • Ne pas passer par le compilateur, mais utiliser directement les méthodes de la JVM
  • Exemple :
  • String.indexOf()
  • Fichier vmSymbol.hpp : a lire pour comprendre les méthodes optimisés

Conclusion

  • Connaitre vos outils
  • Être curieux
  • Attention à la perte de temps


DevoxxFRmeet-upconferencesjavaJVM