{"partition": "head_middle", "source_domain": "blog.ippon.fr", "digest": "sha1:VQJYOWMMITDCFAHFCF435O63D5VSZFZK", "path": "/lustre/fsn1/projects/rech/qgz/uzq54wg/processed_redpajama/base_processing/output/fr/2014-15/000_00037.parquet"}
Front-end
Agilité
Le Blog d'Ippon Technologies Java : Accès directs à la mémoire (off-Heap)
Par Christophe PARAGEAUD ByteBuffer, Garbage, Java, JVM, off-Heap, Stack, sun.misc.Unsafe, Threads La zone mémoire la plus connue d’une JVM est la heap mais ce n’est pas la seule zone de stockage disponible.
Nous verrons comment est structurée la mémoire d’une JVM et comment allouer de l’espace en dehors de la Heap ?
Et ce, dans le but de pouvoir conserver les données en mémoire même pour les applications les plus consommatrices.
Points abordés :
Quelles sont les méthodes pour instancier de la mémoire hors heap
Les cas d’applications (Cache, Memory Mapped File)
Problèmes rencontrés
LMAX : 6 millions d’opérations par seconde
Java Ergonomics : Faut-il encore tuner la JVM ?
Cas pratique de tuning JVM d’une application
JSF dans le Cloud en 30 minutes
La zone mémoire la plus connue d’une JVM est la heap mais ce n’est pas la seule zone de stockage disponible.
Introduction et théorie
Voici les différentes zones que l’on peut retrouver dans un process Java :
Process Java
On y trouve des zones techniques : JVM, OS.
Des zones de stockage de données : Mémoire Heap et native.
La zone d’échange entre la JVM et l’OS : Librairies.
La gestion de la memoire Java est parfois assez déroutante pour les débutants : les paramètres de gestion les plus connus sont ms et mx qui régissent la taille de la Heap alors que nous venons de voir que ce n’est pas la seule zone mémoire d’une JVM.
Java nio a introduit le principe de mémoire off-heap (java 1.4). Java 7 l’a étendu (JSR-203/NIO2).
Les objets concernés sont les ByteBuffers (java.nio.ByteBuffer) avec allocation directe (maximum de 2 Go par buffer).
Concrètement il s’agit d’un tableau de Bytes qui sera stocké dans la mémoire native.
La nature même du stockage (sous forme binaire) impose une sérialisation/désérialisation des objets.
Tout d’abord le tableau suivant montre pourquoi il faut privilégier la mémoire aux autres types d’accès.
Comparaison des coûts de lecture en fonction du type de mémoire
Vitesse lecture
Mémoire (RAM)
10-60 ns
Accès réseau
10000-30000 ns
Disques SSD
70000-120000 ns
3000000-10000000 ns
La conclusion semble évidente : pour des raisons de performances, il faut privilégier la mémoire locale à tout autre type de stockage.