Perf ug comment ne plus rajouter de ram a vos jvm sans savoir pourquoi
Transcript of Perf ug comment ne plus rajouter de ram a vos jvm sans savoir pourquoi
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 JAVA 1
TAKE AWAY 4
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)
XRoot
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 TenuredB A
0 0 0 0 0 0 0 0 0 0
512
byte
s
0 reference card0
Eden S0 S1 TenuredB A
0 0 0 0 0 0 0 0 0
512
byte
s
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 [email protected]
44
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