SlideShare a Scribd company logo
1 of 45
Download to read offline
1
Tél : +41 21 312 94 15
www.octo.com
© OCTO 2015
Avenue du théâtre 7
CH-1005 Lausanne - SUISSE
Comment ne plus ajouter de
RAM à vos JVM sans savoir
pourquoi...
2
ANALYSE DE JVM LIVE
Agenda
2
ANALYSE DE DUMP
3
PRINCIPES DE GESTION DE MÉMOIRE EN JAVA1
TAKE AWAY4
3
Cette présentation est focalisée sur OpenJdk, les notions
présentées restent cependant valables pour la JVM d’IBM
Pour des raisons de compréhension, certains mécanismes sont
simplifiés…
Avant propos
4
Principes de gestion de mémoire en Java
Hypothèse générationnelle
Rappels
Les variations entre les versions de JVM
Déterminer qu’un objet est libérable
5
Principes de gestion de mémoire en Java
Rappels
6
Tous les objest sont alloués sur la heap
  Pas d’allocation dans la stack, que des références
Chaque thread possède une thread local areas
  Permet les allocations sans synchronisation
  Sauf pour les objets de grande taille
Un objet ne peut pas être désaloué explicitement
  C’est le GC – ou ramasse-miettes qui est en charge de ça
Allocations
7
Lorsqu’il n’est plus référencé (indirectement) par une racine (‘root’)
  Il n’est plus possible d’obtenir une référence sur cet objet
Java n’utilise pas un mécanisme de compteur de références
  Il n’y a pas de fuite mémoire technique possible
Quand un objet peut-il être nettoyé ?
8
Principes de gestion de mémoire en Java
Hypothèse générationnelle
9
La plupart des objets ne survivent pas longtemps
  Il est plus efficace de rechercher prioritairement les objets à nettoyer
parmi les jeunes objets
  Les références des vieux objets vers les récents sont (relativement) peu
nombreux
Hypothèse générationnelle (Java 1.4+)
nb instances
age / temps
10
3 memory pools
Young Generation
Old Generation
Perm
11
3 memory pools
Young Generation
Old Generation
Perm
1
12
3 memory pools
Young Generation
Old Generation
Perm
1
2
13
3 memory pools
Young Generation
Old Generation
Perm
1
2
3
14
(Quelques) options de la JVM
15
Principes de gestion de mémoire en Java
Déterminer qu’un objet est libérable
16
Les ‘strong references’ sont des ‘pointeurs’
  Object a = b;
object.attribut = c
Mais aussi les autres types de référence (java.lang.ref.Reference)
SoftReference, WeakReference, and PhantomReference
Références
17
Lorsqu’il n’est plus référencé (indirectement) par une racine (‘root’)
Java n’utilise pas un mécanisme de compteur de références
  Il n’y a pas de fuite mémoire technique possible
Les racines sont constituées de tout ce qui permet d’atteindre un objet :
  Des piles d’appels (stack)
  Des registres CPU
  Des références JNI
  Classes chargées par le SystemClassLoader
  Des autres Memory Pools
Tenured pour Young
  Young pour Tenured
Quand un objet peut-il être nettoyé ?
18
Young Tenured
(1) (1) (6) (6)
Root
Références Cross Memory Pool
TenuringThreshold=6
19
Young Tenured
(1) (1) (6) (6)
Root
Minor GC
Références Cross Memory Pool
TenuringThreshold=6
20
Références Cross Memory Pool
TenuringThreshold=6
Young Tenured
(1) (1) (7) (7)
Root
(7) (7)
Minor GC
21
Young Tenured
(7) (7)
Root
(2) (2)
Références Cross Memory Pool
TenuringThreshold=6
22
Références Cross Memory Pool
Young Tenured
(7) (7)
Root
(2) (2)
X
23
Young Tenured
(7) (7)
Root
(2) (2)
X
??
Minor GC
Références Cross Memory Pool
24
Young Tenured
(7) (7)
Root
(2) (2)
X
Root
Références Cross Memory Pool
25
La promotion précoce ou inutile d’objets en Tenured
provoquera d’autres problèmes par la suite
  Cela va faire augmenter les références entre la old génération et la
young, ce qui est contraire aux hypothèses générationnelles
Mettre des références à null peut aider le collecteur à mieux libérer
la mémoire
  En restant raisonnable
Références Cross Memory Pool
26
Un GC survient
  Lors d’un échec d’allocation
  La mémoire est pleine
  La mémoire est trop fragmentée pour la taille souhaitée
  La mémoire atteint un seuil pour certain algorithme ( ≃92% pour CMS)
  Un appel explicite à System.gc() (C’est le mal !)
  QQQ sun.rmi.dgc.client.gcInterval and sun.rmi.dgc.server.gcInterval.
Lors d’un GC, on parcours le graph des objets référencés par toutes
les racines
  Un partie de ce parcours est bloquant (stop-the-world)
  Le SWAP de JVM durant un stop-the-world est dramatique
Fonctionnement - sommaire - des algorithmes Java
27
Le parcours de toutes les racines n’est pas efficace pour un Young GC
  Ne passe pas l’échelle lorsque la taille de la JVM augmente
On utilise un mécanisme de ‘dirty cards’ pour limiter le parcours de la
mémoire
Fonctionnement - sommaire - des algorithmes Java
0 reference card0
Eden S0 S1 Tenured
B A
0 0 0 0 0 0 0 0 0 0
512bytes
0 reference card0
Eden S0 S1 Tenured
B A
0 0 0 0 0 0 0 0 0
512bytes
01 0
28
Principes de gestion de mémoire en Java
Les variations entre les versions de JVM
29
Java 6 (6u45)
  Décembre 2006 à Février 2013 (fin des mises à jour)
Java7 (7u80)
  Juillet 2011 à Avril 2015
Java8 (8u60)
  Mars 2014 à Septembre 2017 (?)
Java9
  > Avril 2016
Les versions Java
30
Serial GC
Parallel GC
Parallel Old GC (Parallel Compacting GC)
Concurrent Mark & Sweep GC (or "CMS")
Garbage First (G1) GC
Les algorithmes en jdk 7/8
31
Remplacement de la PermGen par le MetaSpace
  Similaire à JRockit et IBM
  Décommissionnement PermGen (commencé en Java7)
MetaSpace en Native Memory => plus de limitation de taille
  Le flag –XX:PermSize disparait
Introduction de G1 (Garbage-First Garbage)
  Orienté faible pause STW (+6Go et moins 500ms de pause)
  G1 fait de la défragmentation (compaction)
  CMS reste toujours meilleur pour les petites JVM
  Par défaut à partir de Java 9 (JEP 248)
En Java 8
32
Organisation classique de la mémoire
Organisation de la mémoire G1
G1
33
Démo
34
Monitorer vos JVM
  Live
Analyser vos traces GC
  Analyser a posteriori l’évolution de la mémoire et des GC
Analyser vos dumps mémoire
  Comprendre ce qui remplit votre JVM au runtime
Démo
35
JConsole ou VisualVM
Monitoring distant
jdk/bin/jstatd -J-Djava.security.policy=security.policy
Demo Live Monitoring
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
36
Identifier votre vrai problème [1/2]
Memory leak
37
Memory consumption
Identifier votre vrai problème [2/2]
38
-verbose:gc
-Xloggc:/var/log/elasticsearch/gc.log
  -XX:+UseGCLogFileRotation
  -XX:NumberOfGCLogFiles=3
  -XX:GCLogFileSize=200M
-XX:+PrintGCDetails
-XX:+PrintTenuringDistribution
-XX:+PrintGCCause
-XX:+PrintGCApplicationStoppedTime
Ce sont des paramètres de production
Analyse :
•  http://www.hp.com/go/java (free)
•  https://github.com/chewiebug/GCViewer (free)
•  http://www.jclarity.com/censum/ (payant)
Demo - Log GC
39
Dump en cas d’OutOfMemory
  -XX:+HeapDumpOnOutOfMemoryError
Si vous avez des soucis avec la mémoire de vos JVM faites des
heapdumps avant de les éteindre
sudo jmap -dump:file=memory.hprof -F $pid
Pour diminuer le temps de freeze de la JVM
  sudo gcore -o jvm.hprof $pid ç bloquant mais rapide
sudo jmap -J-d64 -dump:live,file=jvm.hprof /usr/bin/java /tmp/jvm.core
http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/
x
Dump mémoire
40
Dominator Tree
An object x dominates an object y if every path in the object graph
from the start (or the root) node to y must go through x.
The immediate dominator x of some object y is the dominator
closest to the object y.
41
Take away
42
Pas d’optiomisation a priori
  “Premature optimization is the root of all evil”
Measure Don’t Guess
Remettez vos habitudes en question
  Les JVM ont évolué, des paramêtres utilisés sur de vieux Jdk n’ont plus de raison d’être
  Exemple : -Xms != -Xmx
Mettez à jour vos JVM
Mettez en place le monitoring distant
jdk/bin/jstatd -J-Djava.security.policy=security.policy
Activer les traces sur vos JVM
  Log GC
  -Xloggc:logs/gc-`date '+%Y%m%d-%H%M'`.log
  -XX:+PrintGCDetails -XX:+PrintTenuringDistribution
  -XX:+PrintGCCause -XX:+PrintGCApplicationStoppedTime
  -Xloggc:/var/log/elasticsearch/gc.log
  -XX:+UseGCLogFileRotation
  -XX:NumberOfGCLogFiles=3
  -XX:GCLogFileSize=200M
  Analyse avec http://www.hp.com/go/java (free) ou http://www.jclarity.com/censum/ (payant)
  -XX:+HeapDumpOnOutOfMemoryError
  Faites des heapdumps avant d’éteindre vos JVM
sudo jmap -dump:file=memory.hprof -F $pid
Take away
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
43
Tél : +41 21 312 94 15
www.octo.com
© OCTO 2015
Avenue du théâtre 7
CH-1005 Lausanne - SUISSE
+Philippe Kernevez
@pkernevez
pkernevez@octo.com
44
recrutement@octo.com
Vous croyez que les technologies changent le
monde ?
Nous aussi ! Rejoignez-nous !
45
https://redstack.wordpress.com/2011/01/06/visualising-garbage-
collection-in-the-jvm/
http://www.infoq.com/articles/Java_Garbage_Collection_Distilled
http://www.cubrid.org/blog/dev-platform/understanding-java-
garbage-collection/
https://dzone.com/articles/java-8-permgen-metaspace
http://www.infoq.com/articles/Java-PERMGEN-Removed
http://insightfullogic.com/2013/May/07/garbage-collection-java-3/
http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html
http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/
Crédits

More Related Content

What's hot

Guss webcasts Query Memory Grants - june 2013
Guss webcasts   Query Memory Grants - june 2013Guss webcasts   Query Memory Grants - june 2013
Guss webcasts Query Memory Grants - june 2013David BAFFALEUF
 
Audit Applications Javaee Solutions Linux Ow2
Audit Applications Javaee Solutions Linux Ow2Audit Applications Javaee Solutions Linux Ow2
Audit Applications Javaee Solutions Linux Ow2Catherine Nuel
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaOlivier BAZOUD
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Jean-Michel Doudoux
 
Paris JUG Spring Batch
Paris JUG Spring BatchParis JUG Spring Batch
Paris JUG Spring BatchOlivier BAZOUD
 
Chtijug springbatch 2011
Chtijug springbatch 2011Chtijug springbatch 2011
Chtijug springbatch 2011Olivier BAZOUD
 
EBIZNEXT-RIAK
EBIZNEXT-RIAKEBIZNEXT-RIAK
EBIZNEXT-RIAKebiznext
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOlivier DASINI
 
JavaEE - Test & Deploy
JavaEE - Test & DeployJavaEE - Test & Deploy
JavaEE - Test & DeployAlexis Hassler
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocutionParis_Storm_UG
 
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !ochafik
 
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comStockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comDamien Krotkine
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Julien Jakubowski
 
Tests d'intégration avec Arquillian
Tests d'intégration avec ArquillianTests d'intégration avec Arquillian
Tests d'intégration avec ArquillianAlexis Hassler
 
3 t drools
3 t drools3 t drools
3 t droolsjeansoat
 
soft-shake.ch - Tests d'intégration JavaEE avec Arquillian
soft-shake.ch - Tests d'intégration JavaEE avec Arquilliansoft-shake.ch - Tests d'intégration JavaEE avec Arquillian
soft-shake.ch - Tests d'intégration JavaEE avec Arquilliansoft-shake.ch
 

What's hot (20)

Guss webcasts Query Memory Grants - june 2013
Guss webcasts   Query Memory Grants - june 2013Guss webcasts   Query Memory Grants - june 2013
Guss webcasts Query Memory Grants - june 2013
 
Audit Applications Javaee Solutions Linux Ow2
Audit Applications Javaee Solutions Linux Ow2Audit Applications Javaee Solutions Linux Ow2
Audit Applications Javaee Solutions Linux Ow2
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - Xebia
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8
 
Spring Batch Avance
Spring Batch AvanceSpring Batch Avance
Spring Batch Avance
 
Paris JUG Spring Batch
Paris JUG Spring BatchParis JUG Spring Batch
Paris JUG Spring Batch
 
Chtijug springbatch 2011
Chtijug springbatch 2011Chtijug springbatch 2011
Chtijug springbatch 2011
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Drools et les moteurs de règles
Drools et les moteurs de règlesDrools et les moteurs de règles
Drools et les moteurs de règles
 
Riak introduction
Riak introductionRiak introduction
Riak introduction
 
EBIZNEXT-RIAK
EBIZNEXT-RIAKEBIZNEXT-RIAK
EBIZNEXT-RIAK
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
 
JavaEE - Test & Deploy
JavaEE - Test & DeployJavaEE - Test & Deploy
JavaEE - Test & Deploy
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocution
 
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
 
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comStockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
 
Tests d'intégration avec Arquillian
Tests d'intégration avec ArquillianTests d'intégration avec Arquillian
Tests d'intégration avec Arquillian
 
3 t drools
3 t drools3 t drools
3 t drools
 
soft-shake.ch - Tests d'intégration JavaEE avec Arquillian
soft-shake.ch - Tests d'intégration JavaEE avec Arquilliansoft-shake.ch - Tests d'intégration JavaEE avec Arquillian
soft-shake.ch - Tests d'intégration JavaEE avec Arquillian
 

Viewers also liked

Better Product Definition with Lean UX and Design Thinking
Better Product Definition with Lean UX and Design ThinkingBetter Product Definition with Lean UX and Design Thinking
Better Product Definition with Lean UX and Design ThinkingJeff Gothelf
 
Matinale DevOps / Docker
Matinale DevOps / DockerMatinale DevOps / Docker
Matinale DevOps / DockerZenika
 
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"UX STRAT
 
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...Zenika
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJosé Paumard
 
Http2 les impacts dans le web
Http2 les impacts dans le webHttp2 les impacts dans le web
Http2 les impacts dans le webneuros
 
Monitoring Compteur EDF avec node.js
Monitoring Compteur EDF avec node.jsMonitoring Compteur EDF avec node.js
Monitoring Compteur EDF avec node.jslaurenthuet
 
Séminaire en ligne - Email Kinetic - 30 Mai 2017
Séminaire en ligne - Email Kinetic - 30 Mai 2017Séminaire en ligne - Email Kinetic - 30 Mai 2017
Séminaire en ligne - Email Kinetic - 30 Mai 2017Experian
 
Introducing HTTP/2
Introducing HTTP/2Introducing HTTP/2
Introducing HTTP/2Ido Flatow
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Jean-Michel Doudoux
 
NightClazz Java 8 Decouverte
NightClazz Java 8 DecouverteNightClazz Java 8 Decouverte
NightClazz Java 8 DecouverteZenika
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéZenika
 
HTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien LanduréHTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien LanduréZenika
 
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelleAgile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelleZenika
 
So, you wanna migrate to Java 9?
So, you wanna migrate to Java 9?So, you wanna migrate to Java 9?
So, you wanna migrate to Java 9?Tomek Adamczewki
 
Going reactive in java
Going reactive in javaGoing reactive in java
Going reactive in javaJosé Paumard
 

Viewers also liked (20)

Better Product Definition with Lean UX and Design Thinking
Better Product Definition with Lean UX and Design ThinkingBetter Product Definition with Lean UX and Design Thinking
Better Product Definition with Lean UX and Design Thinking
 
JavaFX et le JDK9
JavaFX et le JDK9JavaFX et le JDK9
JavaFX et le JDK9
 
Company_Profile_Digital_1
Company_Profile_Digital_1Company_Profile_Digital_1
Company_Profile_Digital_1
 
Matinale DevOps / Docker
Matinale DevOps / DockerMatinale DevOps / Docker
Matinale DevOps / Docker
 
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
UX STRAT USA: Leah Buley, "The Role of UX / CX in Business"
 
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridge
 
Http2 les impacts dans le web
Http2 les impacts dans le webHttp2 les impacts dans le web
Http2 les impacts dans le web
 
Monitoring Compteur EDF avec node.js
Monitoring Compteur EDF avec node.jsMonitoring Compteur EDF avec node.js
Monitoring Compteur EDF avec node.js
 
Séminaire en ligne - Email Kinetic - 30 Mai 2017
Séminaire en ligne - Email Kinetic - 30 Mai 2017Séminaire en ligne - Email Kinetic - 30 Mai 2017
Séminaire en ligne - Email Kinetic - 30 Mai 2017
 
Introducing HTTP/2
Introducing HTTP/2Introducing HTTP/2
Introducing HTTP/2
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 
Http2 right now
Http2 right nowHttp2 right now
Http2 right now
 
NightClazz Java 8 Decouverte
NightClazz Java 8 DecouverteNightClazz Java 8 Decouverte
NightClazz Java 8 Decouverte
 
Http2
Http2Http2
Http2
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery Avancé
 
HTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien LanduréHTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien Landuré
 
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelleAgile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
 
So, you wanna migrate to Java 9?
So, you wanna migrate to Java 9?So, you wanna migrate to Java 9?
So, you wanna migrate to Java 9?
 
Going reactive in java
Going reactive in javaGoing reactive in java
Going reactive in java
 

Similar to Perf ug comment ne plus rajouter de ram a vos jvm sans savoir pourquoi

Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Jérôme Tamborini
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Jean-Michel Doudoux
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfJean-Michel Doudoux
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introductionsabrine_hamdi
 
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?RUDDER
 
Et pourquoi pas JEE ?
Et pourquoi pas JEE ?Et pourquoi pas JEE ?
Et pourquoi pas JEE ?PALO IT
 
Java virtual machine : Notions de base
Java virtual machine : Notions de baseJava virtual machine : Notions de base
Java virtual machine : Notions de baseANASYS
 
Direct memory 3_devoxx_fr_2012-2.04.18
Direct memory 3_devoxx_fr_2012-2.04.18Direct memory 3_devoxx_fr_2012-2.04.18
Direct memory 3_devoxx_fr_2012-2.04.18Benoit Perroud
 
Direct memory @ devoxxfr
Direct memory @ devoxxfrDirect memory @ devoxxfr
Direct memory @ devoxxfrOlivier Lamy
 
Les secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceLes secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceOCTO Technology
 
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKVoxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKJean-Michel Doudoux
 
Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Cyrille Le Clerc
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
Poza 2019 11-21-java_oueneston
Poza 2019 11-21-java_ouenestonPoza 2019 11-21-java_oueneston
Poza 2019 11-21-java_ouenestonJozaIT
 
Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10Jean-Michel Doudoux
 
Nantes jug 2018 - Java le changement c'est maintenant
Nantes jug 2018 - Java le changement c'est maintenantNantes jug 2018 - Java le changement c'est maintenant
Nantes jug 2018 - Java le changement c'est maintenantJean-Michel Doudoux
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Jean-Michel Doudoux
 

Similar to Perf ug comment ne plus rajouter de ram a vos jvm sans savoir pourquoi (20)

Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introduction
 
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?
 
Diagnostic performances
Diagnostic performancesDiagnostic performances
Diagnostic performances
 
Et pourquoi pas JEE ?
Et pourquoi pas JEE ?Et pourquoi pas JEE ?
Et pourquoi pas JEE ?
 
Java virtual machine : Notions de base
Java virtual machine : Notions de baseJava virtual machine : Notions de base
Java virtual machine : Notions de base
 
Direct memory 3_devoxx_fr_2012-2.04.18
Direct memory 3_devoxx_fr_2012-2.04.18Direct memory 3_devoxx_fr_2012-2.04.18
Direct memory 3_devoxx_fr_2012-2.04.18
 
Direct memory @ devoxxfr
Direct memory @ devoxxfrDirect memory @ devoxxfr
Direct memory @ devoxxfr
 
Javaoop
JavaoopJavaoop
Javaoop
 
Les secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceLes secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquence
 
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKVoxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
Poza 2019 11-21-java_oueneston
Poza 2019 11-21-java_ouenestonPoza 2019 11-21-java_oueneston
Poza 2019 11-21-java_oueneston
 
Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10
 
Nantes jug 2018 - Java le changement c'est maintenant
Nantes jug 2018 - Java le changement c'est maintenantNantes jug 2018 - Java le changement c'est maintenant
Nantes jug 2018 - Java le changement c'est maintenant
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018
 

Perf ug comment ne plus rajouter de ram a vos jvm sans savoir pourquoi

  • 1. 1 Tél : +41 21 312 94 15 www.octo.com © OCTO 2015 Avenue du théâtre 7 CH-1005 Lausanne - SUISSE Comment ne plus ajouter de RAM à vos JVM sans savoir pourquoi...
  • 2. 2 ANALYSE DE JVM LIVE Agenda 2 ANALYSE DE DUMP 3 PRINCIPES DE GESTION DE MÉMOIRE EN JAVA1 TAKE AWAY4
  • 3. 3 Cette présentation est focalisée sur OpenJdk, les notions présentées restent cependant valables pour la JVM d’IBM Pour des raisons de compréhension, certains mécanismes sont simplifiés… Avant propos
  • 4. 4 Principes de gestion de mémoire en Java Hypothèse générationnelle Rappels Les variations entre les versions de JVM Déterminer qu’un objet est libérable
  • 5. 5 Principes de gestion de mémoire en Java Rappels
  • 6. 6 Tous les objest sont alloués sur la heap   Pas d’allocation dans la stack, que des références Chaque thread possède une thread local areas   Permet les allocations sans synchronisation   Sauf pour les objets de grande taille Un objet ne peut pas être désaloué explicitement   C’est le GC – ou ramasse-miettes qui est en charge de ça Allocations
  • 7. 7 Lorsqu’il n’est plus référencé (indirectement) par une racine (‘root’)   Il n’est plus possible d’obtenir une référence sur cet objet Java n’utilise pas un mécanisme de compteur de références   Il n’y a pas de fuite mémoire technique possible Quand un objet peut-il être nettoyé ?
  • 8. 8 Principes de gestion de mémoire en Java Hypothèse générationnelle
  • 9. 9 La plupart des objets ne survivent pas longtemps   Il est plus efficace de rechercher prioritairement les objets à nettoyer parmi les jeunes objets   Les références des vieux objets vers les récents sont (relativement) peu nombreux Hypothèse générationnelle (Java 1.4+) nb instances age / temps
  • 10. 10 3 memory pools Young Generation Old Generation Perm
  • 11. 11 3 memory pools Young Generation Old Generation Perm 1
  • 12. 12 3 memory pools Young Generation Old Generation Perm 1 2
  • 13. 13 3 memory pools Young Generation Old Generation Perm 1 2 3
  • 15. 15 Principes de gestion de mémoire en Java Déterminer qu’un objet est libérable
  • 16. 16 Les ‘strong references’ sont des ‘pointeurs’   Object a = b; object.attribut = c Mais aussi les autres types de référence (java.lang.ref.Reference) SoftReference, WeakReference, and PhantomReference Références
  • 17. 17 Lorsqu’il n’est plus référencé (indirectement) par une racine (‘root’) Java n’utilise pas un mécanisme de compteur de références   Il n’y a pas de fuite mémoire technique possible Les racines sont constituées de tout ce qui permet d’atteindre un objet :   Des piles d’appels (stack)   Des registres CPU   Des références JNI   Classes chargées par le SystemClassLoader   Des autres Memory Pools Tenured pour Young   Young pour Tenured Quand un objet peut-il être nettoyé ?
  • 18. 18 Young Tenured (1) (1) (6) (6) Root Références Cross Memory Pool TenuringThreshold=6
  • 19. 19 Young Tenured (1) (1) (6) (6) Root Minor GC Références Cross Memory Pool TenuringThreshold=6
  • 20. 20 Références Cross Memory Pool TenuringThreshold=6 Young Tenured (1) (1) (7) (7) Root (7) (7) Minor GC
  • 21. 21 Young Tenured (7) (7) Root (2) (2) Références Cross Memory Pool TenuringThreshold=6
  • 22. 22 Références Cross Memory Pool Young Tenured (7) (7) Root (2) (2) X
  • 23. 23 Young Tenured (7) (7) Root (2) (2) X ?? Minor GC Références Cross Memory Pool
  • 24. 24 Young Tenured (7) (7) Root (2) (2) X Root Références Cross Memory Pool
  • 25. 25 La promotion précoce ou inutile d’objets en Tenured provoquera d’autres problèmes par la suite   Cela va faire augmenter les références entre la old génération et la young, ce qui est contraire aux hypothèses générationnelles Mettre des références à null peut aider le collecteur à mieux libérer la mémoire   En restant raisonnable Références Cross Memory Pool
  • 26. 26 Un GC survient   Lors d’un échec d’allocation   La mémoire est pleine   La mémoire est trop fragmentée pour la taille souhaitée   La mémoire atteint un seuil pour certain algorithme ( ≃92% pour CMS)   Un appel explicite à System.gc() (C’est le mal !)   QQQ sun.rmi.dgc.client.gcInterval and sun.rmi.dgc.server.gcInterval. Lors d’un GC, on parcours le graph des objets référencés par toutes les racines   Un partie de ce parcours est bloquant (stop-the-world)   Le SWAP de JVM durant un stop-the-world est dramatique Fonctionnement - sommaire - des algorithmes Java
  • 27. 27 Le parcours de toutes les racines n’est pas efficace pour un Young GC   Ne passe pas l’échelle lorsque la taille de la JVM augmente On utilise un mécanisme de ‘dirty cards’ pour limiter le parcours de la mémoire Fonctionnement - sommaire - des algorithmes Java 0 reference card0 Eden S0 S1 Tenured B A 0 0 0 0 0 0 0 0 0 0 512bytes 0 reference card0 Eden S0 S1 Tenured B A 0 0 0 0 0 0 0 0 0 512bytes 01 0
  • 28. 28 Principes de gestion de mémoire en Java Les variations entre les versions de JVM
  • 29. 29 Java 6 (6u45)   Décembre 2006 à Février 2013 (fin des mises à jour) Java7 (7u80)   Juillet 2011 à Avril 2015 Java8 (8u60)   Mars 2014 à Septembre 2017 (?) Java9   > Avril 2016 Les versions Java
  • 30. 30 Serial GC Parallel GC Parallel Old GC (Parallel Compacting GC) Concurrent Mark & Sweep GC (or "CMS") Garbage First (G1) GC Les algorithmes en jdk 7/8
  • 31. 31 Remplacement de la PermGen par le MetaSpace   Similaire à JRockit et IBM   Décommissionnement PermGen (commencé en Java7) MetaSpace en Native Memory => plus de limitation de taille   Le flag –XX:PermSize disparait Introduction de G1 (Garbage-First Garbage)   Orienté faible pause STW (+6Go et moins 500ms de pause)   G1 fait de la défragmentation (compaction)   CMS reste toujours meilleur pour les petites JVM   Par défaut à partir de Java 9 (JEP 248) En Java 8
  • 32. 32 Organisation classique de la mémoire Organisation de la mémoire G1 G1
  • 34. 34 Monitorer vos JVM   Live Analyser vos traces GC   Analyser a posteriori l’évolution de la mémoire et des GC Analyser vos dumps mémoire   Comprendre ce qui remplit votre JVM au runtime Démo
  • 35. 35 JConsole ou VisualVM Monitoring distant jdk/bin/jstatd -J-Djava.security.policy=security.policy Demo Live Monitoring grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
  • 36. 36 Identifier votre vrai problème [1/2] Memory leak
  • 38. 38 -verbose:gc -Xloggc:/var/log/elasticsearch/gc.log   -XX:+UseGCLogFileRotation   -XX:NumberOfGCLogFiles=3   -XX:GCLogFileSize=200M -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintGCCause -XX:+PrintGCApplicationStoppedTime Ce sont des paramètres de production Analyse : •  http://www.hp.com/go/java (free) •  https://github.com/chewiebug/GCViewer (free) •  http://www.jclarity.com/censum/ (payant) Demo - Log GC
  • 39. 39 Dump en cas d’OutOfMemory   -XX:+HeapDumpOnOutOfMemoryError Si vous avez des soucis avec la mémoire de vos JVM faites des heapdumps avant de les éteindre sudo jmap -dump:file=memory.hprof -F $pid Pour diminuer le temps de freeze de la JVM   sudo gcore -o jvm.hprof $pid ç bloquant mais rapide sudo jmap -J-d64 -dump:live,file=jvm.hprof /usr/bin/java /tmp/jvm.core http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/ x Dump mémoire
  • 40. 40 Dominator Tree An object x dominates an object y if every path in the object graph from the start (or the root) node to y must go through x. The immediate dominator x of some object y is the dominator closest to the object y.
  • 42. 42 Pas d’optiomisation a priori   “Premature optimization is the root of all evil” Measure Don’t Guess Remettez vos habitudes en question   Les JVM ont évolué, des paramêtres utilisés sur de vieux Jdk n’ont plus de raison d’être   Exemple : -Xms != -Xmx Mettez à jour vos JVM Mettez en place le monitoring distant jdk/bin/jstatd -J-Djava.security.policy=security.policy Activer les traces sur vos JVM   Log GC   -Xloggc:logs/gc-`date '+%Y%m%d-%H%M'`.log   -XX:+PrintGCDetails -XX:+PrintTenuringDistribution   -XX:+PrintGCCause -XX:+PrintGCApplicationStoppedTime   -Xloggc:/var/log/elasticsearch/gc.log   -XX:+UseGCLogFileRotation   -XX:NumberOfGCLogFiles=3   -XX:GCLogFileSize=200M   Analyse avec http://www.hp.com/go/java (free) ou http://www.jclarity.com/censum/ (payant)   -XX:+HeapDumpOnOutOfMemoryError   Faites des heapdumps avant d’éteindre vos JVM sudo jmap -dump:file=memory.hprof -F $pid Take away grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
  • 43. 43 Tél : +41 21 312 94 15 www.octo.com © OCTO 2015 Avenue du théâtre 7 CH-1005 Lausanne - SUISSE +Philippe Kernevez @pkernevez pkernevez@octo.com
  • 44. 44 recrutement@octo.com Vous croyez que les technologies changent le monde ? Nous aussi ! Rejoignez-nous !