web-dev-qa-db-fra.com

Différence entre "sur tas" et "hors tas"

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?

126
Synesso

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).

151
Vineet Reynolds

à 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:

  • Cache de session dans une application serveur. Utilisez un fichier mappé sur la 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 à traiter avec une base de données.
  • Mise en cache des résultats de calcul (requêtes, pages html, ..) (applicable uniquement si le calcul est plus lent que la désérialisation de l'objet de résultat ofc).
  • persistance très simple et rapide en utilisant des fichiers mappés en mémoire

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.

83
R.Moeller

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.

34
Adam

En bref photo

Java On/Off Heap storage in short

crédits de l'image


Image détaillée

Java On/Off Heap storage in details

crédits de l'image

14
mrsrinivas

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.

1
gatkin

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.

1
msj121