Bien que je n'aie pas testé G1 en production, j'ai pensé commenter que les GC sont déjà problématiques pour les cas sans "humongous" heaps. Plus précisément, les services avec seulement, disons, 2 ou 4 gigas peuvent être sévèrement impactés par les GC. Les GC de la jeune génération ne sont généralement pas problématiques car ils se terminent en millisecondes à un chiffre (ou au plus à deux chiffres). Mais les collectes d'ancienne génération sont beaucoup plus problématiques car elles prennent plusieurs secondes avec des tailles d'ancienne génération de 1 giga ou plus.
En théorie, le CMS peut être d'une grande aide dans ce domaine, car il peut exécuter la plupart de ses opérations simultanément. Cependant, au fil du temps, il y aura des cas où il ne pourra pas le faire et devra se rabattre sur la collecte "arrêter le monde". Et lorsque cela se produit (après, disons, 1 heure -- pas souvent, mais toujours trop souvent), eh bien, accrochez-vous à vos chapeaux. Cela peut prendre une minute ou plus. Cela est particulièrement problématique pour les services qui essaient de limiter la latence maximale ; au lieu de prendre, disons, 25 millisecondes pour servir une requête, il faut maintenant dix secondes ou plus. Pour ajouter l'insulte à l'injure, les clients vont souvent interrompre la demande et la réessayer, ce qui entraîne d'autres problèmes (alias "tempête de merde").
C'est un domaine où l'on espérait que G1 serait d'une grande aide. Je travaillais pour une grande entreprise qui offre des services en nuage pour le stockage et la répartition des messages ; et nous ne pouvions pas utiliser CMS car, bien que la plupart du temps il fonctionnait mieux que les variétés parallèles, il avait ces fusions. Ainsi, pendant environ une heure, les choses se sont bien passées, puis les choses se sont emballées... et comme le service était basé sur des grappes, lorsqu'un nœud avait des problèmes, les autres suivaient généralement (puisque les délais d'attente induits par la GC faisaient croire aux autres nœuds que le nœud s'était écrasé, ce qui entraînait des réacheminements).
Je ne pense pas que GC soit un problème pour les applications, et peut-être même que les services non groupés sont moins souvent affectés. Mais de plus en plus de systèmes sont mis en cluster (notamment grâce aux magasins de données NoSQL) et la taille des tas augmente. Les GC d'OldGen sont liés de façon super-linéaire à la taille du tas (ce qui signifie que doubler la taille du tas fait plus que doubler le temps de GC, en supposant que la taille de l'ensemble de données en direct double également).
16 votes
Même si elle pourrait être reformulée de manière plus précise, cette question n'est pas horrible. J'aimerais vraiment que les gens aient à s'expliquer mieux que "Pas une question" lorsqu'ils votent pour fermer.
0 votes
Je n'ai pas voté pour la fermeture, mais j'aurais aimé que le PO fasse un travail plus objectif en détaillant ses griefs avec le CG actuel. De plus, "Java" est un langage alors qu'il parle d'une implémentation, et je ne sais pas ce que signifie "implémenter G1 en production", surtout avec le futur du reste de la question. Si cela doit être dans Java 7, personne ne l'a sûrement utilisé en production ?
6 votes
@Pascal G1 est une fonctionnalité expérimentale disponible dans le JDK depuis la mise à jour 14 du JDK 6. Par "implémenter G1 en production", je pense qu'il voulait dire l'utiliser réellement, ce n'est pas si difficile à comprendre. Et si je suis d'accord pour dire que G1 fait partie du JDK 7, et non de Java, une recherche de Java 7 sur Google renvoie la page d'accueil du JDK 7 comme premier résultat, et les deux termes sont souvent utilisés de manière interchangeable. @Benju Je ne ferais pas confiance aux résultats obtenus avec G1 sur le JDK actuel car il est expérimental, beaucoup de choses pourraient changer d'ici la version officielle.
2 votes
Il semble que le JDK 7, y compris les mises à jour 1, 2 et 3, n'utilise pas le gc G1 par défaut. Vous pouvez le vérifier en utilisant jinfo -flag UseG1GC pid.