Java G1 collecte des ordures dans la production
Depuis Java 7 va utiliser la nouvelle G1 collecte des ordures par défaut est de Java va être capable de gérer un ordre de grandeur plus grand tas sans censés "dévastateur" GC temps de pause? Personne n'a réellement mis en œuvre G1 dans la production, quelles ont été vos expériences?
Pour être juste, la seule fois où j'ai vu vraiment beaucoup de GC pauses est sur de très gros tas, beaucoup plus que d'un poste de travail aurait. Pour préciser ma question; s'G1 ouvrir le portail pour les segments dans les centaines de GO? La TUBERCULOSE?
- Bien qu'il pourrait être reformulé plus précisément, ce n'est pas une horrible question. Je souhaite vraiment que les gens avaient à expliquer mieux que "Pas une question de" lors du vote de près.
- Je n'ai pas le droit de vote à fermer, mais je souhaite que l'OP avait fait un de plus objectif pour le poste de détaillant ses problèmes avec l'actuel GC. Aussi, "Java" est une langue alors qu'il est en train de parler de la mise en œuvre, et je ne sais pas ce que "la mise en œuvre de G1 dans la production", on entend, notamment avec le futur de la le reste de la question. Si c'est pour être dans Java 7, sûrement personne ne l'a utilisé dans la production?
- G1 a été une fonctionnalité expérimentale disponible dans le JDK depuis le JDK 6 update 14. Par "la mise en œuvre de G1 dans la production", je pense qu'il voulait dire en fait de l'utiliser, n'est pas difficile à comprendre. Et même si je conviens que G1 est une partie de JDK 7, pas de Java, une recherche pour Java 7 sur Google renvoie le JDK 7 page d'accueil comme c'est le premier résultat, et les deux termes sont souvent utilisés de façon interchangeable. @Benju je n'aurais pas confiance dans les résultats obtenus avec G1 sur le courant du JDK que c'est expérimental, beaucoup de choses pourraient changer à partir de maintenant de la version officielle.
- Il semble JDK 7 update 1, 2 et 3 ne pas utiliser le G1 gc par défaut. Vous pouvez chect par jinfo -drapeau UseG1GC pid
Vous devez vous connecter pour publier un commentaire.
Il sonne comme le point de G1 est d'avoir de petits temps de pause, au point même où il a la possibilité de spécifier un maximum de temps de pause de la cible.
La collecte des ordures n'est pas un simple "Hey, c'est plein, nous allons passer tout à la fois et recommencer" traiter plus-il est incroyablement complexe, multi-niveau, fond fileté système. Il peut faire beaucoup de son entretien dans le fond avec pas de pause du tout, et il utilise également la connaissance du système de modèles attendus au moment de l'exécution à l'aide, comme en supposant que la plupart des objets de mourir juste après créées, etc.
Je dirais GC des temps de pause sont vont continuer à s'améliorer, de ne pas aggraver, avec les futures versions.
EDIT:
dans la re-lecture, il m'est apparu que j'utilise Java quotidien--Eclipse, Azureus, et les applications que je développe, et il a été un LONG TEMPS depuis que j'ai vu une pause. Pas une longue pause, mais je veux dire tout de pause.
J'ai vu des pauses lorsque je clic droit sur explorateur windows ou (parfois) quand j'ai brancher certains matériels USB, mais avec Java---aucune.
GC est toujours un problème avec quelqu'un?
J'ai été le tester avec un lourd d'application: 60-70 GO alloués à des tas, avec 20-50 GO en cours d'utilisation à tout moment. Avec ces sortes d'applications, c'est un euphémisme de dire que votre kilométrage peut varier. Je suis en cours d'exécution JDK 1.6_22 sur Linux. Les versions mineures sont important-avant à propos de 1.6_20, il y avait des bugs dans le G1 qui a causé aléatoire NullPointerExceptions.
J'ai trouvé qu'il est très bon à rester à l'intérieur de la pause cible vous donner la plupart du temps. La valeur par défaut semble être un 100ms (0,1 seconde) pause, et j'ai été lui dire de faire demi que (-XX:MaxGCPauseMillis=50). Cependant, une fois qu'il est vraiment faible sur la mémoire, il s'affole et fait un arrêt complet-le-monde-de la collecte des ordures. Avec 65GB, qui prend entre 30 secondes et 2 minutes. (Le nombre de Processeurs n'a probablement pas faire une différence; c'est probablement limité par la vitesse du bus.)
Par rapport à la CMS (qui n'est pas le serveur par défaut GC, mais il devrait être pour les serveurs web et autres applications en temps réel), typique des pauses sont beaucoup plus prévisible et peut être beaucoup plus courte. Jusqu'à présent, je vais avoir plus de chance avec la CMS pour les pauses, mais qui peut être aléatoire; je vois seulement quelques fois toutes les 24 heures. Je ne suis pas sûr que l'on sera plus approprié dans mon environnement de production à ce moment, mais probablement G1. Si Oracle conserve tuning, je soupçonne G1 sera finalement le gagnant clair.
Si vous n'êtes pas avoir un problème avec l'existant, ramasseurs d'ordures, il n'y a pas de raison de considérer G1 droit maintenant. Si vous exécutez une faible latence de l'application, comme une application graphique, G1 est probablement le bon choix, avec MaxGCPauseMillis définir vraiment faible. Si vous êtes en cours d'exécution d'un lot en mode application, G1 ne pas acheter quelque chose.
Bien que je n'ai pas testé le G1 en production, j'ai pensé que je voudrais commenter que les GCs sont déjà problématique pour les cas sans "humongous" tas. Précisément les services avec juste, disons, 2 ou 4 concerts peuvent être gravement touchés par GC. La jeune génération GCs sont généralement pas problématique, car ils finissent dans un seul chiffre millisecondes (ou tout au plus à deux chiffres). Mais l'ancienne génération, les collections sont d'autant plus problématique qu'ils prennent plusieurs secondes avec old-gen tailles de 1 go ou plus.
Maintenant: dans la théorie de la CMS peut aider beaucoup, car cela peut exécuter la plupart de ses opérations en même temps. Cependant, au fil du temps il y aura des cas où il ne peut pas faire cela et a pour revenir à "arrêter la monde" de la collection. Et quand cela arrive (après, disons, 1 heure -- pas souvent, mais encore trop souvent), eh bien, accrochez-vous à votre f***ing chapeaux. Il peut prendre une minute ou plus. Cela est particulièrement problématique pour les services qui tentent de limiter au maximum la latence; au lieu de il prendre, disons, 25 millisecondes pour servir une requête, il prend maintenant dix secondes ou plus. Pour ajouter la blessure d'insulter les clients seront alors souvent le temps de la demande et de réessayer, conduisant à d'autres problèmes (aka "merde tempête").
C'est un domaine où G1 est à espérer, pour aider beaucoup. J'ai travaillé pour une grande entreprise qui offre des services de cloud pour le stockage et la répartition de messages; et nous ne pouvions pas utiliser de CMS puisque, bien que la plupart du temps ça fonctionne mieux que le parallèle variétés, il y avait ces effondrements. Donc pendant environ une heure, les choses étaient belles; et puis des trucs frappé le ventilateur... et parce que le service a été basée sur les clusters, quand un nœud dans le pétrin, d'autres, généralement suivi (car GC-induit des délais d'attente conduire à d'autres nœuds de croire nœud s'était écrasé, conduisant à re-routes).
Je ne pense pas que GC est un grand problème pour les applications, et peut-être même les non-cluster services sont moins souvent touchés. Mais de plus en plus de systèmes sont regroupés (esp. grâce à NoSQL magasins de données) et les tailles de tas sont en croissance. OldGen GCs sont super-linéairement liée à la taille de segment de mémoire (ce qui signifie que le doublement de la taille du segment de plus du double GC, en supposant que la taille de vivre ensemble de données double).
Azul CTO, Gil Tene, a une belle vue d'ensemble des problèmes associés à la Collecte des Ordures et un examen des différentes solutions dans son La compréhension de Java la Collecte des Ordures et Ce que Vous Pouvez Faire à Ce sujet présentation, et il n'y a plus de détail dans cet article: http://www.infoq.com/articles/azul_gc_in_detail.
Azul C4 Garbage Collector dans notre Zing JVM est à la fois parallèle et simultanée, et utilise les mêmes GC mécanisme pour les nouveaux et anciens générations, travaillent en même temps et le compactage dans les deux cas. Plus important encore, la C4 n'a pas de cessez-le-monde tombe en arrière. Tous les compactage est effectué simultanément avec l'exécution de l'application. Nous avons des clients qui sont en cours d'exécution très grandes (des centaines de giga-Octets) avec le pire cas GC temps de pause de <10 msec, et en fonction de l'application, il est souvent fois moins de 1-2 ms.
Le problème avec la CMS et G1 est qu'à un certain point de Java heap mémoire doit être compactée, et deux de ces ramasseurs d'ordures cessez-le-monde/STW (c'est à dire mettre en pause l'application) pour effectuer le compactage. Ainsi, alors que la CMS et G1 pouvez pousser hors STW pauses, ils n'ont pas les éliminer. Azul C4, cependant, ne peut éliminer complètement STW pauses et c'est pourquoi Zing a ces faibles GC pauses, même pour des tas gigantesque de tailles.
Et de corriger une déclaration faite dans une précédente réponse, Zing ne nécessite pas de modifications pour le Système d'Exploitation. Il fonctionne exactement comme n'importe quel autre JVM sur non modifiée des distributions Linux.
Nous sommes déjà à l'aide de G1GC, depuis près de deux ans. Faire grande dans notre mission critique du système de traitement des transactions, et Il s'est avéré être d'un grand soutien.w.r.t haut débit, peu de pauses, de simultanéité et optimisé lourds la gestion de la mémoire.
Nous sommes suivantes à l'aide de paramètres de la JVM:
Mis à jour
Le G1 collecteur de réduire l'impact de collections complètes. Si vous avez une application où vous avez déjà réduit la nécessité pour les collections complètes, la Concurrente de la carte de Balayage collecteur est tout aussi bon et dans mon expérience, est plus courte collecte mineure fois.
Il semble que G1 départ JDK7u4 est enfin officiellement pris en charge, consultez la RN pour JDK7u4
http://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html.
De nos tests, toujours pour les grandes machines virtuelles à l'écoute de la CMS est toujours mieux que le G1, mais je suppose que ça passera mieux.
CMS peut entraîner lentement dégradé les performances, même si vous êtes en cours d'exécution sans l'accumulation de titularisation des objets. C'est à cause de la fragmentation de la mémoire qui G1 soi-disant éviter le plus possible.
Le mythe de G1 uniquement disponible avec le soutien rémunérés est juste que, un mythe. Sun et Oracle ont clarifié ce sur le JDK page.
G1 GC est censé fonctionner mieux. Mais si le paramètre -XX:MaxGCPauseMillis de manière trop agressive, des ordures, collecte trop lentement. Et c'est pourquoi une GC déclenchée dans David Leppik l'exemple.
J'ai juste mis en œuvre G1 Garbage Collector dans notre terre Cuite Grand projet Mémoire. Tout en travaillant sur les différents types de collecteurs G1 nous a donné les meilleurs résultats avec moins de 600ms réagir à temps.
Vous pouvez trouver les résultats du test (26 au total) ici
Espère que cela aide.
Récemment, j'ai été ému de
CMS pour G1GC avec la 4G tas & 8 core processeur sur des serveurs avec JDK 1.7.45.
(JDK 1.8.x G1GC est préféré plus de 1,7 mais en raison de certaines limitations, je dois en tenir à 1.7.45 version)
J'ai configuré ci-dessous les principaux paramètres et gardé tous les autres paramètres à leurs valeurs par défaut.
Si vous voulez affiner ces paramètres, jetez un oeil à cette oracle article.
Des principales observations:
Encore, mais je suis heureux que Max GC temps de pause est inférieure à celle de la CMS. J'ai mis Max GC temps de pause comme 1,5 secondes et cette valeur n'a pas été franchi encore.
Liées SE question:
Java 7 (JDK 7) collecte des ordures et de la documentation sur G1
J'ai récemment migré une partie de Twicsy vers un nouveau serveur avec 128 GO de RAM et décidé de l'utiliser 1.7. J'ai commencé en utilisant tous les mêmes paramètres de mémoire que j'ai utilisé avec 1.6 (j'ai plusieurs instances en cours d'exécution à faire des choses différentes, n'importe où à partir de 500 mo de mémoire jusqu'à 15 GO, et maintenant une nouvelle avec 40 GO) et qui ne fonctionne pas bien du tout. 1.7 semble utiliser plus de tas de 1,6, et j'ai connu beaucoup de problèmes au cours de la première quelques jours. Heureusement, j'ai eu beaucoup de RAM pour travailler avec et frappé jusqu'à la RAM pour la plupart de mes processus, mais était encore avoir quelques problèmes. Mon MO a été d'utiliser un très petit minimum de la taille du segment de 16m, même avec un max de tas de plusieurs giga-octets, puis tourner sur les surcoûts GC. Ce qui a maintenu la marque une pause à un minimum. Cela ne fonctionne pas maintenant, et j'ai dû augmenter la taille minimale à propos de ce que j'ai prévu de l'utiliser en moyenne dans le tas, et qui a bien fonctionné. J'ai encore des différentiels GC allumé, mais je vais essayer sans. Pas de pauses que ce soit maintenant, et les choses semblent être en cours d'exécution très rapide. Donc, je pense que la morale de l'histoire est de ne pas attendre de votre mémoire les paramètres de traduire parfaitement, passant de 1,6 à 1,7.
G1 rend l'application beaucoup plus agile: le latancy de la demande va augmenter - l'application peut être nommé "soft-en temps réel". Cela se fait par le remplacement de deux types de GC s'exécute (petites mineures et une grande sur Titularisés Gen) de taille égale petits.
Pour plus de détails, regardez ceci:
http://geekroom.de/java/java-expertise-g1-fur-java-7/
Je travaille avec Java, pour les petits et les grands Tas, et la question de la GC et de la Pleine GC apparaît chaque jour, que les contraintes peuvent être plus stricts que d'autres : dans certains environnement, de 0,1 seconde de scavenger GC ou Full GC, tuer tout simplement la fonctionnalité, et ont une granularité fine de la configuration et de la capacité est importante (CMS, sgci, d'autres ... l'objectif est ici d'avoir la meilleure réponse possible du temps avec la quasi temps réel de traitement (ici, le temps réel, le traitement est souvent 25 ms ), donc, en gros, toutes les améliorations en GC de l'ergonomie de sna heuristique sont les bienvenus !
- Je utiliser G1GC sur Java 8 et aussi avec Groovy (aussi Java 8), et je suis en train de faire différents types de charges de travail, et surtout G1GC fonctionne comme ceci:
L'utilisation de la mémoire est très faible, par exemple de 100 mo au lieu de 500 MO par rapport à Java par défaut des paramètres de
Le temps de réponse est cohérente et très faible
Les performances entre les paramètres par défaut et G1GC est de 20% de ralentissement lors de l'utilisation de G1GC dans le pire des cas (sans réglage, single-threaded application). Il n'est pas beaucoup compte tenu du bon temps de réponse et la faible utilisation de la mémoire.
Lors de l'exécution de Tomcat qui est multi-thread, la performance globale est de 30% et l'utilisation de la mémoire est beaucoup plus faible ainsi les temps de réponse sont beaucoup plus faibles.
Donc, en général, lorsque vous utilisez vraiment différentes charges de travail, G1GC est très bon collector de Java 8 pour applications multi-thread, et de même pour les mono-thread, il y a certains avantages.
Il n'est pas suggéré d'utiliser java8 w/G1GC pour float calcul de point avec point d'accès-comme la JVM. C'est dangereux pour l'intégrité de l'application & précision.
https://bugs.openjdk.java.net/browse/JDK-8148175
JDK-8165766
JDK-8186112