Java 10 réduit les temps de pause Full GC en améliorant de manière itérative son algorithme existant.
-XX:ParallelGCThreads
Si j'ai bien compris, G1 ne gère pas ses cycles de collecte en même temps que notre application. L'application mettra toujours l'application en pause périodiquement et les pauses Full GC augmenteront avec des tailles de tas plus grandes.
Alors, comment améliore-t-il les performances? Quelqu'un peut-il expliquer cela?
En fait, Java 11 est recommandé si vous utilisez G1GC car de nombreux travaux ont été effectués sur celui-ci pour réduire son empreinte et réduire ses pauses par rapport à 10.
Un résumé a été fait sur la liste de diffusion hotspot-gc-use autour des différentes améliorations apportées aux versions 11, 10 et 9 pour G1GC. Vous pouvez le trouver à ce lien: http://mail.openjdk.Java. net/pipermail/hotspot-gc-use/2018-juin/002759.html
Un résumé rapide de ce post sur la liste:
[...] Je voudrais souligner que globalement, avec G1, comparé à JDK8, il est possible de réduire de 60% le temps de pause "gratuitement" sur x64 processeurs (probablement davantage sur ARM/PPC en raison des modifications spécifiques mentionnées), avec un encombrement mémoire très réduit.
Car ce n’est qu’en Java 10 que G1GC est devenu complètement parallèle dans le cycle complet du GC arrêté-le-monde. Selon JEP 307: GC complet parallèle pour G1 ceci améliore la latence du pire des scénarios:
Le récupérateur de place G1 est conçu pour éviter les collectes complètes, mais lorsque les collectes simultanées ne peuvent pas récupérer la mémoire assez rapidement, une récupération complète du GC se produit. L’implémentation actuelle du CPG complet pour G1 utilise un seul algorithme thread-mark-sweep-compact. Nous avons l'intention de paralléliser l'algorithme mark-sweep-compact et d'utiliser le même nombre de threads que les collections Young et Mixed. Le nombre de threads peut être contrôlé par l'option -XX: ParallelGCThreads, mais cela affectera également le nombre de threads utilisés pour les collections Young et Mixed.