De http://code.google.com/p/fast-serialization/wiki/QuickStartHeapOff
Qu'est-ce que le déchargement en tas ?
En général, tous les objets non temporaires que vous allouez sont gérés par le ramasseur de déchets de Java. Bien que la VM fasse un travail décent en matière de collecte des déchets, à un certain moment, la VM doit effectuer une GC complète. Une GC complète implique l'analyse de la totalité du tas alloué, ce qui signifie que les pauses/ralentissements de la GC sont proportionnels à la taille du tas d'une application. Ne faites donc pas confiance à ceux qui vous disent que la mémoire est bon marché. En Java, la consommation de mémoire nuit aux performances. De plus, vous pouvez obtenir des pauses notables lorsque la taille du tas est supérieure à 1 Go. Cela peut être désagréable si vous avez des activités en temps quasi réel, dans un cluster ou une grille, un processus java peut ne plus répondre et être abandonné du cluster.
Cependant, les applications serveur actuelles (souvent construites sur des frameworks gonflants ;-) ) nécessitent facilement des tas bien au-delà de 4 Go.
Une solution à ces besoins en mémoire consiste à "décharger" certaines parties des objets vers le tas non Java (directement alloué par le système d'exploitation). Heureusement, java.nio fournit des classes permettant d'allouer/lire et écrire directement des morceaux de mémoire "non gérés" (même des fichiers mappés en mémoire).
On peut donc allouer de grandes quantités de mémoire "non gérée" et l'utiliser pour y sauvegarder des objets. Afin de sauvegarder des objets arbitraires dans la mémoire non gérée, la solution la plus viable est l'utilisation de la sérialisation. Cela signifie que l'application sérialise les objets dans la mémoire hors-hachette, et que plus tard, l'objet peut être lu en utilisant la désérialisation.
La taille du tas gérée par la VM java peut être maintenue à un faible niveau, de sorte que les pauses GC sont de l'ordre du millième, tout le monde est content, le travail est fait.
Il est clair que la performance d'un tel tampon hors tas dépend principalement de la performance de l'implémentation de la sérialisation. Bonne nouvelle : pour une raison quelconque, la sérialisation FST est assez rapide :-).
Exemples de scénarios d'utilisation :
- Cache de session dans une application serveur. Utilisez un fichier mappé en mémoire pour stocker des gigaoctets de sessions utilisateur (inactives). Une fois que l'utilisateur s'est connecté à votre application, vous pouvez accéder rapidement aux données relatives à l'utilisateur sans avoir à vous occuper d'une base de données.
- Mise en cache des résultats de calcul (requêtes, pages html, ..) (seulement applicable si le calcul est plus lent que la désérialisation de l'objet résultat ofc).
- persistance très simple et rapide à l'aide de fichiers mappés en mémoire
Edit : Pour certains scénarios, on peut choisir des algorithmes de Garbage Collection plus sophistiqués comme ConcurrentMarkAndSweep ou G1 pour supporter des tas plus grands (mais cela a aussi ses limites au-delà de 16GB). Il existe également une JVM commerciale avec une GC améliorée sans pause (Azul).
0 votes
Pour savoir comment utiliser la mémoire hors-heap, voir : stackoverflow.com/a/30027374/895245
0 votes
Le lien dans la question ne fonctionne pas. Nouveau lien vers la dernière version : ehcache.org/documentation/3.8/tiering.html#off-heap