Différence entre “sur le tas” et “off-heap”
Ehcache parle sur le tas et hors de segment de mémoire. Quelle est la différence? Ce JVM arguments sont utilisés pour configurer?
- Pour savoir comment utiliser de la mémoire heap, voir: stackoverflow.com/a/30027374/895245
Vous devez vous connecter pour publier un commentaire.
Le tas magasin se réfère à des objets qui seront présents dans le tas Java (et également sous réserve de GC). D'autre part, l'off-heap magasin se réfère à (sérialisés) des objets qui sont gérés par EHCache, mais elle est stockée à l'extérieur du tas (et aussi de ne pas sujet à la GC). Comme le off-heap magasin continue d'être géré dans la mémoire, il est légèrement plus lent que le tas de magasin, mais toujours plus rapide que le disque en magasin.
Les détails internes impliqués dans la gestion et l'utilisation des tas de magasin ne sont pas très évidente dans le lien affiché dans la question, il serait sage de vérifier les détails de Terre Cuite BigMemory, qui est utilisé pour gérer le hors-disque store. BigMemory (off-heap store) est utilisé pour éviter la surcharge de GC sur un tas de plusieurs centaines de méga-octets ou Giga-grand. BigMemory utilise l'espace d'adressage de mémoire de la JVM processus, via direct ByteBuffers qui ne sont pas assujettis à la GC, contrairement à d'autres natifs des objets Java.
de http://code.google.com/p/fast-serialization/wiki/QuickStartHeapOff
Qu'est-ce que le Tas de Déchargement ?
Généralement de tous les non-temporaire objets que vous allouer sont gérés par le garbage collector de java. Bien que la VM ne fait un travail décent de faire la collecte des ordures, à un certain point la machine virtuelle a en faire un soi-disant "Full GC'. Un full GC consiste à scanner le total alloué Tas, ce qui signifie GC pauses/ralentissements sont proportionnelles à une des applications de la taille du segment. Donc ne faites pas confiance à une personne vous dit "la Mémoire est Cher". En java, la mémoire de la consommation qui affecte les performances. En outre, vous pouvez obtenir notable des pauses à l'aide de tailles de tas > 1 Go. Cela peut être désagréable si vous avez des quasi-temps réel des choses qui se passent, dans un cluster ou de la grille d'un processus java pourriez me répondre et obtenir la tombée de la grappe.
Cependant aujourd'hui des applications de serveur (souvent construits sur le dessus de bloaty cadres 😉 ) facilement demander des tas bien au-delà de 4 go.
Une solution à ces exigences de mémoire, est de "décharger" parties des objets à la non-java heap (attribuées directement à partir de l'OS). Heureusement java.nio fournit des classes d'allouer directement/lire et écrire "non géré" segments de mémoire (même les fichiers mappés en mémoire).
On peut donc allouer une grande partie de "non géré" la mémoire et l'utiliser pour sauvegarder les objets là. Pour enregistrer des objets dans une mémoire non managée, la solution la plus viable est l'utilisation de la Sérialisation. Cela signifie que l'application sérialise les objets dans le offheap de mémoire, plus tard, l'objet peut être lu à l'aide de la désérialisation.
La taille de segment de mémoire gérés par la machine virtuelle java peut être restreint, de sorte GC pauses sont dans le millis, tout le monde est heureux, le travail est accompli.
Il est clair, que l'exercice de l'un segment de mémoire tampon dépend principalement de la performance de la sérialisation de mise en œuvre. Bonne nouvelle: pour une raison FST-sérialisation est assez rapide :-).
Exemple de scénarios d'utilisation:
Edit: Pour certains scénarios, on pourrait choisir plus sophistiqués de Collecte des Ordures algorithmes tels que ConcurrentMarkAndSweep ou G1 pour soutenir les grandes tas (mais cela a aussi ses limites au-delà de 16 GO tas). Il y a aussi un commercial de la JVM avec l'amélioration "de la pauseless' GC (Azul) disponibles.
Le tas est l'endroit de la mémoire où vos objets alloués dynamiquement en direct. Si vous avez utilisé
new
puis c'est sur le tas. C'est par opposition à l'espace de pile, qui est l'endroit où la fonction stack vie. Si vous avez une variable locale alors que la référence est sur la pile.Java heap est soumis à la collecte des déchets et les objets sont utilisables directement.
EHCache hors du tas de stockage de votre objet sur le tas, sérialise, et le stocke sous forme d'octets dans une partie de la mémoire qui EHCache gère. C'est comme le stockage sur le disque, mais il est encore dans la mémoire RAM. Les objets ne sont pas directement utilisables dans cet état, ils doivent être désérialisé premier. Pas soumises à la collecte des déchets.
En bref photo
pic de crédits
Image détaillée
pic de crédits
La JVM ne sais rien à propos de hors-la mémoire du tas. Ehcache met en œuvre une mémoire cache sur le disque ainsi que d'un cache en mémoire.
Pas à 100%; cependant, il semble que le tas est un objet ou d'un ensemble de l'espace alloué (RAM) qui est construit dans la fonctionnalité du code Java lui-même ou, plus probablement, la fonctionnalité de ehcache lui-même, et l'arrêt de segment de mémoire Ram est-il propre système; cependant, il semble que c'est l'une ampleur plus lent qu'il n'est pas organisé, sens il ne peut pas utiliser un segment de mémoire (ce qui signifie un long espace de ram), et utilise à la place les différents espaces d'adressage probablement ce qui rend un peu moins efficace.
Puis, bien sûr, le palier inférieur est l'espace du disque dur lui-même.
Je n'utilise pas ehcache, si vous ne voulez pas confiance en moi, mais qu'est ce que j'ai recueillies à partir de leur documentation.