ݺߣ

ݺߣShare a Scribd company logo
#DevoxxFR
Bo?te  outils d'investigation
des soucis de mmoire
Jean Bisutti (Arolla)
@jean_bisutti
1
#DevoxxFR
#DevoxxFR 3
#DevoxxFR
Fentre W
Calcul de moyenne mobile
Trade
amounts
#DevoxxFR
Fentre W
Calcul de moyenne mobile
Trade
amounts
#DevoxxFR
Fentre W
Calcul de moyenne mobile
Trade
amounts
#DevoxxFR
Fentre W
Calcul de moyenne mobile
Trade
amounts
#DevoxxFR
Fentre W
Calcul de moyenne mobile
Trade
amounts
#DevoxxFR
Fentre W
Calcul de moyenne mobile
Trade
amounts
#DevoxxFR
Fentre W
Calcul de moyenne mobile
Trade
amounts
#DevoxxFR
Fentre W
Calcul de moyenne mobile
Trade
amounts
#DevoxxFR
Ajouter des paramtres  la
JVM
-Xms100m -Xmx100m
R A M
#DevoxxFR
Logs GC
Ajouter des paramtres  la
JVM
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xms100m -Xmx100m
R A M
#DevoxxFR
Logs GC
Ajouter des paramtres  la
JVM
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log
JDK 9
JEP 158
Unified JVM
Logging
-XLog
-Xms100m -Xmx100m
R A M
#DevoxxFR
jvisualvm
#DevoxxFR
Analyser les logs du GC
#DevoxxFR
gc.log



2017-04-04T07:19:27.624+0200: 342.850: [GC (Allocation Failure)
[PSYoungGen: 25069K->6274K(27136K)] 92467K->73712K(95744K),
0.0035847 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2017-04-04T07:19:24.859+0200: 340.092: [Full GC (Ergonomics)
[PSYoungGen: 6287K->0K(27136K)] [ParOldGen: 68574K->50589K(68608K
74862K->50589K(95744K), [Metaspace: 12009K->12009K(1060864K)],
0.1529467 secs] [Times: user=0.59 sys=0.00, real=0.16 secs]
#DevoxxFR
gc.log



2017-04-04T07:19:27.624+0200: 342.850: [GC (Allocation Failure)
[PSYoungGen: 25069K->6274K(27136K)] 92467K->73712K(95744K),
0.0035847 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2017-04-04T07:19:24.859+0200: 340.092: [Full GC (Ergonomics)
[PSYoungGen: 6287K->0K(27136K)] [ParOldGen: 68574K->50589K(68608K
74862K->50589K(95744K), [Metaspace: 12009K->12009K(1060864K)],
0.1529467 secs] [Times: user=0.59 sys=0.00, real=0.16 secs]
#DevoxxFR
Eden S0
Young gen
S1
Old gen
#DevoxxFR
GC mineur GC
Eden S0
Young gen
S1
Old gen
AVANT
S1
GC (Allocation Failure)
#DevoxxFR
Eden S0
Young gen
S1
Old gen
AVANT
APRES
S1
GC mineur GCGC (Allocation Failure)
#DevoxxFR
Full GC
Eden S0
Young gen
S1
Old gen
AVANT
#DevoxxFR
Full GC
Eden S0
Young gen
S1
Old gen
AVANT
APRES
#DevoxxFR
gc.log



2017-04-04T07:19:27.624+0200: 342.850: [GC (Allocation Failure)
[PSYoungGen: 25069K->6274K(27136K)] 92467K->73712K(95744K),
0.0035847 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2017-04-04T07:19:24.859+0200: 340.092: [Full GC (Ergonomics)
[PSYoungGen: 6287K->0K(27136K)] [ParOldGen: 68574K->50589K(68608K
74862K->50589K(95744K), [Metaspace: 12009K->12009K(1060864K)],
0.1529467 secs] [Times: user=0.59 sys=0.00, real=0.16 secs]
#DevoxxFR
Analyser les logs du G
GC Viewer
GCViewer
#DevoxxFR
Analyser les logs du G
GC Viewer
GCViewer
#DevoxxFR
Analyser les logs du G
GC Viewer
GCViewer
#DevoxxFR
Analyser les logs du G
GC Viewer
GCViewer
#DevoxxFR
GCViewer
#DevoxxFR
GCViewer
Old gen
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
GCViewer
Old gen
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Utiliser les commandes du
JDK
#DevoxxFR
Dclencher un dump de la heap
jmap -dump:live,format=b,file=fileName.hprof pid
jcmd pid GC.heap_dump fileName.hprof
M
E
M
O
R
Y
L
E
A
K
#DevoxxFR
Dclencher un dump de la heap
jmap -dump:live,format=b,file=fileName.hprof pid
jcmd pid GC.heap_dump fileName.hprof
M
E
M
O
R
Y
L
E
A
K
#DevoxxFR
Dclencher un dump de la heap
jmap -dump:live,format=b,file=fileName.hprof pid
jcmd pid GC.heap_dump fileName.hprof
Paramtre JVM : -XX:+HeapDumpOnOutOfMemoryError
M
E
M
O
R
Y
L
E
A
K
#DevoxxFR
M
E
M
O
R
Y
L
E
A
K
Analyser le dump avec le
Memory Analyzer Tool (MAT)
Graphe dobjets
A B
C
ED
GF
H
#DevoxxFR
M
E
M
O
R
Y
L
E
A
K
Analyser le dump avec le
Memory Analyzer Tool (MAT)
Graphe dobjets
A B
C
ED
GF
H
#DevoxxFR
M
E
M
O
R
Y
L
E
A
K
Analyser le dump avec le
Memory Analyzer Tool (MAT)
Graphe dobjets
A B
C
ED
GF
H
Dominator tree
A B
E
C
D
F
H
G
#DevoxxFR
M
E
M
O
R
Y
L
E
A
K
Analyser le dump avec le
Memory Analyzer Tool (MAT)
Graphe dobjets
A B
C
ED
GF
H
Dominator tree
A B
E
C
D
F
H
G
#DevoxxFR
Memory Analyzer Tool
#DevoxxFR
Memory Analyzer Tool
#DevoxxFR
Memory Analyzer Tool
#DevoxxFR
Memory Analyzer Tool
#DevoxxFR
Memory Analyzer Tool
#DevoxxFR
Memory Analyzer Tool
#DevoxxFR
Memory Analyzer Tool
#DevoxxFR
Memory Analyzer Tool
Instrument
#DevoxxFR
Memory Analyzer Tool
1 242 000 trades
#DevoxxFR
#DevoxxFR
Memory Analyzer Tool
#DevoxxFR
Memory Analyzer Tool
#DevoxxFR
Memory Analyzer Tool
1 242 000 trades
#DevoxxFR
#DevoxxFR
#DevoxxFR
#DevoxxFR
#DevoxxFR
#DevoxxFR
#DevoxxFR
#DevoxxFR
Throughputt 13% 85 %
Tous les trades +
CopyOnWriteArrayList<Trade>t
W trades +
CopyOnWriteArrayList<Trade> t
#DevoxxFR
#DevoxxFR
Java Mission Control
#DevoxxFR
Java Mission Control
-
XX:+UnlockCommercialFeatur
es
-XX:+FlightRecorder
#DevoxxFR
Java Mission Control
#DevoxxFR
Java Mission Control
#DevoxxFR
Java Mission Control
#DevoxxFR
Java Mission Control
#DevoxxFR
Thread Local
Allocation Buffer
Java Mission Control
#DevoxxFR
Java Mission Control
#DevoxxFR
Java Mission Control
#DevoxxFR
Java Mission Control
#DevoxxFR
#DevoxxFR
Throughputt
Code : https://github.com/jeanbisutti/memory-investigation
13% 85 % 98 %
Tous les trades +
CopyOnWriteArrayList<Trade>t
W trades +
CopyOnWriteArrayList<Trade> t
W trades +
BlockingQueue<Integer>
#DevoxxFR 8888
#DevoxxFR
89
89
Commandes
JDK
Paramtres
JVM
Analyseur de log GC
#DevoxxFR
JDK 9
jcmd
jps
jstat
jmap
Experimental
*
* https://docs.oracle.com/javase/9/tools/tools-and-command-reference.htm
#DevoxxFR
91
91
Commandes
JDK
Paramtres
JVM
Analyseur de log GC
Profiler
Memory
Analyser
Tool
Questions ?

More Related Content

Bo?te outils d'investigation des soucis de mmoire

Editor's Notes

  • #2: La JVM utilise utilise types de mmoire: heap, off-heap et metaspace par exemple
  • #12: Jai lanc lapplication pendant une heure. Jai ajout des paramtres la JVM
  • #17: -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log Faire Full GC The copy-on-write collections derive their thread safety from the fact that as long as en effectively immutable object is properly published, no further synchronization is required when accessing it. They implement mutability by cmultreating and republishing a new copy of the collection every time it is modified. TLAB : Thread Local Allocation Buffer. Dans leden, des threads ont une rgion ddie o ils allouent des objets. Thread-Local Allocation buffers (TLABs) improving multithreaded allocation throughput by giving each thread its own buffer (i.e., a small chunk of the eden) from which to allocate. OOP : Ordinary Object Pointer For heaps that are between 4Gb and 32 Gb, use compressed oops.
  • #20: Les algorithmes de ramasse miette divise la heap en diffrentes gnrations : la young generation et la old generation. La young generation est elle-mme Les objets de courte dure de vie vont tre situs dans la young gen. Ceux de dure longue vont se retrouver dans la old gen. Paralell GC multiple threads are used to speed up garbage collection
  • #21: Un GC mineur est dclench lorsque leden est pleine.
  • #22: Le GC mineur enlve tous les objets de leden : certains sont dplacs vers dans une zone survivor, dautres sont dplacs vers la old gen. De nombreux objets plus rfrencs sont supprims.
  • #23: Lors dun full GC, toute la young gen est vide. Les objets restant dans la old gen sont ceux toujours rfrencs.
  • #24: Lors dun full GC, toute la young gen est vide. Les objets restant dans la old gen sont ceux toujours rfrencs.
  • #28: 75% du temps faire des Full GC
  • #31: Nous pouvons nous demander pourquoi la old gen est si remplie. Le JDK propose des commandes pour collecter des informations sur les JVM en cours dexcution.
  • #35: Si nous avons oubli dactiver les logs du GC
  • #40: Nous avons vu que la old gen tait bien remplie. Il serait bien de savoir quelles sont les objets prsents dans la heap. Lapplication a-t-elle besoin de plus de mmoire pour fonctionner ou bien des objets sont-ils inutilement maintenus en mmoire ???
  • #43: Classes des objets
  • #47: Ensuite les plus gros objets prsents dans la heap sont des tableaux dobjet Nous allons nous aider dun outils Avant cela nous allons dclencher un dump de la heap.
  • #51: Le Memory Analyzer Tool permet de trouver l'origine d'une fuite mmoire en se basant sur le dominator tree. Un objet C domine un objet D si tous les chemins pour arriver D doivent passer par C.
  • #61: Cet objet est une map dont nous pouvons explorer le contenu
  • #67: Pourquoi maintient-t-on en mmoire 1 242 00 trades ?
  • #74: Il suffit en fait de stocker les trades uniquement pour la taille de fentre considr.
  • #76: Il serait bien davoir un outils qui nous dise quelles sont les mthodes qui cres beaucoup dobjet dans lespace young.
  • #83: TLAB : Thread Local Allocation Buffer. Dans leden, des threads ont une rgion ddie o ils allouent des objets
  • #84: .
  • #87: Loutil nous dit que, depuis une notre mthode consume, que 40 Go de tableaux dobjets sont cres par linvocation dune mthode add dune CopyOnWriteArrayList.
  • #88: Pour corriger ce problme nous pourrions utiliser une BlockingQueue. Nous pourrions aussi
  • #90: Lignes de commande scriptables
  • #92: Commandes scriptables GC Viewer : analyse posteriori (on peut rcuprer logs de production) Le profiler nous a permis de trouver quelle mthode alloue une quantit importante dobjets faible dure de vie. Le Memory Analyser Tool nous a permis de trouver lobjet qui maintenait une grappe importante dobjets en mmoire. Nous avons ainsi pu corriger le problme de fuite mmoire.