1. Réduire la pression sur
l'allocation mémoire
Le prochain pas dans l'optimisation des performances
de la JVM
by Olivier Lamy et Benoit Perroud
1
2. Abstract
• Cache Hors Tas (off-heap)
– Rappel sur la mémoire Java
– Différences de Cache (on-heap vs. off-
heap)
• Apache Direct Memory
– Principes et Architecture
– Cas d'utilisation de la vie réelle
– Prochaines étapes
• Questions
2
3. Speakers
• Olivier Lamy, Architecte@Talend, Apache
Member & Direct Memory Committer
– @olamy
• Benoit Perroud, Software
Engineer@Verisign & Apache Direct
Memory Committer
– @killerwhile
3
4. Avant de commencer
• Désolés d'avance pour le fran-glais que
nous allons parler
4
5. Apache Direct Memory
Apache Direct Memory is a multi layered cache
implementation featuring off-heap memory storage
to enable caching of java objects without degrading
jvm performance.
Le but recherché par le projet est de
décharger la JVM de la mémoire
consommée par les objets mis en cache
afin de réduire le temps d'exécution du GC.
5
6. Apache Direct Memory
• Projet dans l'incubateur de l'Apache
Software Foundation
• Arrivé dans l'incubateur en automne 2011
• 12 développeurs, 10+ contributeurs
• En développement actif
– Sujet à changement et à bugs
6
8. La Mémoire Java (2)
• Ramasse-miette (GC)
– Le GC gèle complètement l'exécution
du processus pour s'exécuter
– Rend l'exécution du programme non
déterministe
8
9. Cache Mémoire
• Cache dans la mémoire Java (on-heap)
– Pas de pénalité d'utilisation
– Mais occupe de la mémoire Java la
rendant indisponible au
fonctionnement de l'application
TODO : Image avec RAM
9
10. Cache Mémoire (2)
• Cache hors de la mémoire Java (off-heap)
– Pénalité de sérialisation
• Protobuf, Avro, Thrift, MsgPack, ...
– Réduit la taille de la mémoire gérée
par la JVM
10
11. Design et Architecture
• ByteBuffer.allocateDirect
• ByteBuffers sont alloués en masse, et
découpés à la demande
• Développé en couche
– Pour une meilleure séparation des
responsabilités
11
12. Stratégies d'Allocation
• Fusion de ByteBuffers
– Pas de perte de mémoire, mais
fragmentation
– A utiliser si ratio lecture / écriture haut
• Taille fixe des ByteBuffers
– Perte de mémoire, mais pas de
fragmentation (*)
– A utiliser si objets de taille similaire
12
13. Cache Multi-Niveaux
• Idée : une très petite portion d'objets en
cache en mémoire Java (on-heap), le
reste hors de la mémoire Java (off-heap)
– Mmmh, ça ressemble à Terracotta
BigMemory tout ça
– Apache Direct Memory peut être
injecté dans Ehcache. Ouuups ;)
13
14. Server de Cache
> PUT /dm/cache/bordeaux HTTP/1.1
> Content-Type:text/plain
{"millesime":"bordeaux","description":"so good so good"}
< HTTP/1.1 200 OK
< X-DirectMemory-SerializeSize: 58
< Content-Length: 0
> GET /dm/cache/bordeaux HTTP/1.1
> Accept:text/plain
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Content-Length: 51
{"millesime":"2003","description":"so good so good"}
> DELETE /dm/cache/foo HTTP/1.1
14
15. Prochaines étapes
• JSR 107
• Benchmarks
• Intégrations dans des composants
(Cassandra, Lucene, Tomcat, ...)
• Modification dynamique de la taille du
cache
• Fonctionnalités de Monitoring et
Management
• ...
• https://issues.apache.org/jira/browse/DIRECTMEMORY
15