Notre société envisage de passer à la version JVM 64 bits afin d'éviter la limite de taille de segment maximale de 2 Go. Google m'a donné des résultats très mitigés sur les performances JVM 64 bits. Quelqu'un at-il essayé de déplacer à 64 bits java et partager votre expérienceExpérience de la migration vers la JVM 64 bits
Répondre
Si vous avez besoin du plus gros tas, alors les questions de performance sont plutôt discutables, n'est-ce pas? Ou avez-vous un plan pour la mise à l'échelle horizontale?
Le principal problème que j'ai entendu avec les applications 64 bits est que la récupération complète de la mémoire peut prendre beaucoup de temps (car elle dépend du nombre d'objets en direct). Donc, vous voulez ajuster les paramètres du GC pour éviter les collections complètes (j'ai entendu une anecdote sur une entreprise qui avait 64 Go de tas, et réglé leur GC de sorte qu'ils ne feraient jamais un GC complet, ils feraient simplement une fois par semaine). À part ça, sachez que Java est de conception 32 bits, donc vous ne risquez pas de voir une énorme augmentation des performances à partir des données de déplacement 64 bits à la fois. Et vous êtes toujours limité aux indices de tableau 32 bits.
Nous avons une JVM où le gc fonctionne en parallèle, ce qui fonctionne bien, mais si le gc n'est pas fait quand le prochain gc doit être démarré, la JVM s'arrête jusqu'à ce que le second gc soit terminé. Mal! Ca se passe un peu car le système d'exploitation est très agressif sur l'échange de mémoire. –
Pourriez-vous expliquer ce que vous voulez dire par Java est 32 bits par conception? d'après ce que je sais, Java est indépendant de la plate-forme par la conception non? – Pacerier
La remarque sur 32 bits par conception est étrange. Quand nous parlons de bits 32/64/128, il s'agit généralement de la taille d'un pointeur, ce qui affecte la taille de la mémoire de travail. Le fait que Java utilise ints pour les tableaux limite la taille d'un seul tableau, mais une abstraction comme les buffers nio peut être utilisée pour contourner ce problème. Comme ce n'est pas parfait, il est prévu que les indices soient longs. Cependant, ce n'est pas une limitation technique comme un tas de 4Go. –
Nous avons écrit directement à 64bit et je ne vois pas un comportement anormal ...
fonctionne très bien pour nous. Pourquoi n'essayez-vous pas simplement de le configurer et d'exécuter votre suite de tests de charge sous un profileur comme jvisualvm?
En bref: 64 bits JVMs consomment plus de mémoire pour les références d'objets et quelques autres types (généralement pas significatif), consommer plus de mémoire par thread (significatif souvent sur des sites à fort volume) et vous permettre de ont des tas plus gros (en général seulement important si vous avez beaucoup d'objets de longue durée)
Réponses/commentaires à plus long:
Le commentaire que Java est de 32 bits par conception est trompeur. Java l'adressage mémoire est soit 32, soit 64 bits, mais la spécification VM garantit que la plupart des champs (par exemple, int, long, double, etc.) sont les mêmes indépendamment.
également - les commentaires réglage de GC en pertinente pour le nombre d'objets, peuvent ne pas être pertinent, GC peut être rapide sur JVMs avec de grands tas (j'ai travaillé avec des tas jusqu'à 15 Go, avec très GC rapide) - cela dépend plus comment vous jouez avec les schémas collector générationnels, et quel est votre modèle d'utilisation de l'objet . Alors que dans les passé, les gens ont passé beaucoup de paramètres de réglage de l'énergie , il est la charge de travail très à charge, et moderne (Java 5+) JVMs sont très bons à réglage automatique - à moins que vous avez beaucoup de données que vous êtes plus susceptible de vous nuire que d'aider avec tuning JVM aggresive.
Comme mentionné sur les architectures x86, les aussi 64 bits EMT64 ou processeurs x64 comprennent de nouvelles instructions pour faire des choses comme les écritures atomiques ou d'autres options qui peuvent également avoir un impact sur applications haute performance.
Pourriez-vous expliquer ce que vous entendez par "les champs (par exemple, int, long, double, etc.) sont les mêmes quel que soit"? – Pacerier
Prendre naïvement des charges de travail JVM de 32 bits et les mettre en 64 bits produit un gain de performance et d'espace dans mon expérience. Cependant, la plupart des principaux fournisseurs de JVM ont maintenant mis en œuvre une bonne technologie qui compresse essentiellement certaines des tas - c'est ce qu'on appelle des références compressées ou des oops compressés pour les JVM 64 bits qui ne sont pas "gros" (4: -30gb gamme).
Cela fait une grande différence et devrait faire une transition 32-> 64 impact beaucoup plus faible.
Référence pour la machine virtuelle Java IBM: link text
Je pense que c'est -XX: + UseCompressedOops pour l'oracle jvm – Karussell
x64 ou non-x64? Pour l'essentiel, cela augmente simplement l'utilisation de la mémoire et par conséquent la bande passante mémoire. Pour x86, AMD a créé un jeu d'instructions moins fou que x86. –
@Anders, tout le monde n'est pas tellement obsédé par ces chiffres que vous! : P Certaines personnes (pouvez-vous imaginer?) Répondent simplement pour aider. –
@Vladimir Dyuzhev: Obsessed n'est pas le problème. C'est la façon dont la communauté fonctionne. Répondre et accepter sont la façon dont on détermine qui a une histoire de bonnes réponses. Ne pas accepter signifie pas d'histoire de bonnes réponses. Sans l'histoire de bonnes réponses, il est difficile de savoir quelle confiance accorder à une réponse. –