12
votes

Puis-je utiliser plus de tas que 32 Go avec oups comprimé

Je pouvais comprendre qu'avec Oops comprimé, nous ne pouvons utiliser que 32 Go de RAM. Est-ce qu'il y a de ce que je peux utiliser plus que cela comme en allouant 2 tas ou quelque chose?

merci Vineth


2 commentaires

Que diriez-vous de ne pas utiliser oups comprimé?


J'essaie de stocker une paire de valeur de jour importante à la mémoire principale de l'accès à grande vitesse. Ici, j'ai appliqué de nombreuses optimations telles que, à la fin de 80% de l'espace, est consommée par les références plutôt que les données réelles. Dans la quête de la diminution de l'espace occupé par la référence, j'ai découvert oups compressé.


5 Réponses :


1
votes

Si j'étais à votre place, j'éjoutais de chacun des éléments suivants:

  1. ne pas utiliser oups comprimé.
  2. Réduire la consommation de mémoire de votre application (un profileur de mémoire est un outil extrêmement pratique pour enquêter sur l'utilisation de la mémoire).
  3. Séparaissant la charge de travail sur plusieurs JVM, chacune avec un tas de sous-32 Go.

    Chacun de ce qui précède a le potentiel de résoudre votre problème. Lequel est le plus approprié, c'est vraiment difficile pour nous de dire.

    80% de l'espace est mangé par les références plutôt que les données réelles.

    Cela semble plutôt extrême. Il peut être intéressant de revoir vos structures de données, en mettant l'accent sur la réduction du nombre de références d'objet. J'ai fait des choses le long de ces lignes dans le passé, mais il est très difficile de donner des recommandations spécifiques sans connaître votre problème et les structures de données que vous utilisez actuellement.


1 commentaires

J'ai 15000000000 date, la valeur des paires à stocker. J'ai appliqué la meilleure structure de données pour obtenir la meilleure performance, mais la référence est que la référence est ce qui mange les espaces. 2 JVM est quelque chose que j'ai pensé. S'il y a de meilleures idées, faites le moi savoir.



24
votes

Vous ne pouvez pas avoir de multiples tas (vous pouvez avoir plusieurs JVM, ce qui est appelé à la mise à l'échelle par opposition à la mise à l'échelle).

JVM utilise automatiquement les pointeurs d'objets compressés inférieurs à 32 gibier de mémoire. Si vous comprenez comment cela fonctionne (laissant tomber les plus jeunes trois bits de chaque adresse, car ils sont toujours 0 en raison de l'alignement de la mémoire), vous comprenez que vous ne pouvez pas aller plus loin.

Il y a un fait intéressant: une fois que vous avez dépassé cette bordure de 32 gib, JVM cessera d'utiliser des pointeurs d'objet comprimé, réduisant efficacement la mémoire disponible. Cela signifie augmenter votre tas de JVM au-dessus de 32 gibs, vous devez vous rendre au-dessus. Selon Great tout ce que j'ai appris sur la performance JVM Tuning @Twitter (vers 13h00) Présentation Hauteur croissant de 32 gib à quelque chose de moins de 48 gibrons diminuera réellement la quantité de mémoire disponible (!) car les pointeurs d'objets comprimés ne sont plus là. < / p>


2 commentaires

Eh bien, il n'est pas vrai que le point de pause est de 48Gib. Le nombre exact dépend du nombre de pointeurs que vous détenez en mémoire. Et c'est différent pour chaque application.


@ROKKRALJ Vous avez raison que la pause dépendra même par application. Par exemple, si votre application est principalement "des tableaux 2g d'int", 8g, vous ne verrez presque aucune différence d'utilisation de la mémoire. Pour les modèles d'utilisation «normaux», vous vous retrouvez avec beaucoup de frais supplémentaires des plus grands pointeurs.



1
votes

Quelle est exactement la nature des données?

La manière de le faire pourrait être de stocker les données du tas Java. Vous pouvez le faire en obtenant une mémoire hors tas, en utilisant généralement un direct bytebuffer , puis stocker des données dedans sous la forme d'octets. Cela présente divers avantages; Les objets peuvent être stockés très compacte, vous n'avez pas besoin d'avoir un énorme tas, et les objets ne seront pas balayés par le collecteur des ordures. L'inconvénient est la complexité et le risque de fuites de mémoire.

Il existe des bibliothèques qui peuvent vous aider à faire cela, notamment:


0 commentaires

9
votes

Si vous avez besoin de plus de 32 Go, je vous suggère de considérer en utilisant une mémoire de tas de tas. Cela vous donne efficacement un espace mémoire supplémentaire qui n'utilise pas beaucoup de tas.

Par exemple, j'utilise régulièrement 200-800 Go, mais seulement 1-2 Go de celui-ci. Cela signifie que j'ai une forme la plus efficace de oups comprimés et une capacité pratiquement illimitée. Remarque: Il existe trois formes de oups comprimés,

  • Unshifetd de 32 bits uni (jusqu'à ~ 2 Go)
  • 32 bits déplacés (jusqu'à ~ 26 Go)
  • 32 bits décalés et décalés (jusqu'à ~ 32 Go)

    Deux manières d'utiliser la mémoire de la mémoire de la mémoire Direct sont des byTEbuffeurs et des fichiers mappés en mémoire. Balance de mémoire directe bien jusqu'à environ 3/4 de votre taille de la mémoire principale. Les fichiers mappés de mémoire sont à la hauteur de la taille de votre espace disque dur (typiquement beaucoup plus)

    Ici, j'ai appliqué de nombreuses optimations telles que, à la fin de 80% de l'espace étant mangé par les références plutôt que les données réelles.

    Cela ressemble à vous n'utilisez pas les structures de données les plus efficaces. Vous pouvez utiliser différentes structures de données dans lesquelles des données sont plus des espaces utilisés ou d'au moins 2 / 3rds.


2 commentaires

"J'utilise régulièrement 200-800 gb". Je vous envies ... est-ce la mémoire virtuelle ou soutenue par la RAM réelle?


@Thilo J'utilise la mémoire virtuelle car je n'ai que 128 Go de mémoire principale, mais certains de mes clients ont entre 512 Go et 3 To de la mémoire principale.



6
votes

Vous pouvez utiliser de plus grandes tailles de tas avec un paramètre supplémentaire: -XX: ObjectAlignmentInbytes = alignement code>

Ce paramètre est un réglage fixe des objets Java. La valeur par défaut est 8 code> (octets). La valeur indiquée doit être une puissance de deux, et des gammes de 8 code> à 256 code>. P>

La limite de taille du tas en octets est calculée comme suit:

-XX:ObjectAlignmentInBytes=16


0 commentaires