Ehcache parle de mémoire sur tas et mémoire morte. Quelle est la différence? Quels arguments JVM sont utilisés pour les configurer?
Le magasin sur tas fait référence aux objets qui seront présents dans le tas Java (et également soumis à GC)), tandis que le magasin hors tas fait référence aux objets (sérialisés) qui sont gérés par EHCache, mais stockés en dehors du segment de mémoire (et ne sont pas non plus soumis à GC). Comme le magasin en dehors du tas continue à être géré en mémoire, il est légèrement plus lent que le magasin sur le tas, mais toujours plus rapide que le magasin de disques. .
Les détails internes impliqués dans la gestion et l'utilisation du magasin off-heap ne sont pas très évidents dans le lien affiché dans la question. Il serait donc sage de consulter les détails de Terracotta BigMemory , qui est utilisé pour gérer le magasin hors disque. BigMemory (magasin externe) doit être utilisé pour éviter la surcharge de GC sur un segment de mémoire de plusieurs mégaoctets ou gigaoctets. BigMemory utilise l’espace adresse mémoire du processus JVM, via ByteBuffers directs , qui ne sont pas soumis à la CG, contrairement aux autres objets Java).
à partir de http://code.google.com/p/fast-serialization/wiki/QuickStartHeapOff
Qu'est-ce que le déchargement de tas?
En général, tous les objets non temporaires que vous allouez sont gérés par le ramasse-miettes de Java. Bien que VM effectue un travail correct en effectuant un nettoyage de la mémoire, à un moment donné, le VM doit effectuer ce que l'on appelle un "GC complet". Un GC complet implique analyse du segment de mémoire alloué complet, ce qui signifie que les pauses/ralentissements du GC sont proportionnels à la taille du segment des applications. Ne vous fiez donc à personne qui vous dit que la mémoire est bon marché. Dans Java la consommation de mémoire nuit aux performances De plus, vous pouvez obtenir des pauses notables avec des tailles de tas supérieures à 1 Go. Cela peut être désagréable si vous avez des tâches en temps quasi réel dans un cluster ou une grille, un processus Java peut être ne répondent pas et sont retirés du cluster.
Cependant, les applications serveur actuelles (souvent construites sur des frameworks volumineux ;-)) 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 dans le segment de mémoire non Java (directement alloué à partir du système d'exploitation). Heureusement, Java.nio fournit des classes pour allouer/lire et écrire directement des blocs 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 une 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 externe, l’objet pouvant ensuite être lu à l’aide de la désérialisation.
La taille du segment de mémoire gérée par Java VM peut être maintenue petite, de sorte que les pauses GC sont réduites de moitié), tout le monde est content, le travail accompli.
Il est clair que les performances d'un tel tampon off tas dépendent principalement des performances 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:
Edit: Dans certains scénarios, vous pouvez choisir des algorithmes plus complexes de Garbage Collection, tels que ConcurrentMarkAndSweep ou G1, pour prendre en charge des tas plus importants (mais cela a aussi ses limites au-delà des tas de 16 Go). Il existe également une JVM commerciale avec un GC amélioré (sans pause) (Azul) disponible.
Le tas est l'endroit dans la mémoire où vivent vos objets alloués dynamiquement. Si vous avez utilisé new
, alors c'est sur le tas. C'est par opposition à l'espace de pile, où réside la pile de fonctions. Si vous avez une variable locale, cette référence est sur la pile. Le tas de Java est sujet à la récupération de place et les objets sont directement utilisables.
Le stockage hors segment d'EHCache prend votre objet standard hors du tas, le sérialise et le stocke sous forme d'octets dans une partie de la mémoire gérée par EHCache. C'est comme le stocker sur un disque, mais c'est toujours dans la RAM. Les objets ne sont pas directement utilisables dans cet état, ils doivent d'abord être désérialisés. Aussi non soumis à la collecte des ordures.
La JVM ne sait rien de la mémoire off-tas. Ehcache implémente un cache sur disque ainsi qu'un cache en mémoire.
Pas 100%; cependant, il semble que le tas soit un objet ou un ensemble d’espace alloué (sur la RAM) intégré à la fonctionnalité du code, soit Java lui-même, soit une fonctionnalité plus probable de ehcache lui-même, et hors-tas, Ram possède également son propre système, mais il semble que cela soit une lenteur plus lente car il n’est pas aussi organisé, c’est-à-dire qu’il ne peut pas utiliser un tas (c’est-à-dire un long jeu d’espace de mémoire vive) et utilise adresse des espaces rendant probablement légèrement moins efficace.
Ensuite, le niveau inférieur est l’espace disque lui-même.
Je n'utilise pas ehcache, alors vous ne voudrez peut-être pas me faire confiance, mais c'est ce que j'ai recueilli de leur documentation.