Depuis JDK 8, le garbage collection (GC) de Java a subi une évolution significative, répondant à des défis courants tels que la latence, les temps de pause et la surcharge de mémoire. Cet article explore ces avancées, en se concentrant sur les implications pratiques pour les développeurs passant de versions plus anciennes comme JDK 8 à des alternatives modernes telles que JDK 17 et JDK 21. Que vous mainteniez des applications existantes ou planifiiez de futures migrations, il est crucial de comprendre ces mises à jour.
Points clés
- Améliorations depuis JDK 8 : les versions plus récentes du JDK offrent des améliorations significatives en termes de gestion de la mémoire et de performances des applications.
- Comprendre les options GC : choisir le bon ramasse-miettes pour votre application peut optimiser le comportement et l'utilisation des ressources.
- Mises à jour incrémentielles : des avancées telles que les modes GC générationnels et la disposition des tas basées sur les régions ont transformé le garbage collection, offrant une meilleure évolutivité et efficacité.
Garbage Collection (GC) en Java automatise la gestion de la mémoire, libérant ainsi les développeurs de la gestion des détails de bas niveau. Les deux principaux objectifs de GC sont :
- Allocations rapides : Java utilise des tampons d'allocation locale de thread (TLAB) pour des allocations de mémoire rapides et sans synchronisation.
- Récupération efficace : les algorithmes GC récupèrent la mémoire inutilisée grâce à des techniques telles que le compactage et les listes libres.
Le Java GC moderne divise le tas en deux générations :
- Jeune génération : stocke des objets éphémères, où les collectes sont fréquentes mais rapides.
- Ancienne génération : stocke les objets à longue durée de vie qui survivent à plusieurs cycles GC.
Cette division est basée sur l'hypothèse générationnelle, qui postule que la plupart des objets meurent jeunes, ce qui rend les collections de la jeune génération plus efficaces que les collections en tas complet. Java fournit plusieurs algorithmes GC, chacun adapté à des cas d'utilisation spécifiques :
Garbage Collector | Focus | Use Case | Pause Time | Throughput |
---|---|---|---|---|
Serial GC | Low memory overhead | Small containers | Medium | Low |
Parallel GC | High throughput | Batch processing or large datasets | High | High |
G1 GC | Balanced performance | General-purpose, low-latency workloads | Medium-Low | Medium-High |
ZGC | Ultra-low latency | Large-scale applications, low latency | Sub-millisecond | Medium |
Shenandoah GC | Low latency | Large heaps, near-real-time processing | Very low | Medium |
Introduit comme collecteur par défaut dans JDK 9, G1 GC utilise une disposition de tas basée sur la région et prend en charge le marquage simultané. Cela lui permet de déterminer l’activité sans arrêter les threads d’application. En combinant les collections jeunes et anciennes générations dans des collections mixtes plus petites, G1 réduit les temps de pause et améliore la réactivité globale.
Conçu pour une latence ultra-faible, ZGC peut gérer des tas de la taille d'un téraoctet avec des temps de pause de l'ordre de la milliseconde. Il effectue la plupart de son travail simultanément avec les threads d'application, ce qui le rend idéal pour les applications nécessitant une réactivité constante, telles que les services cloud ou les systèmes financiers.
Le mode générationnel ZGC (introduit dans JDK 21) améliore encore le débit en appliquant l'hypothèse générationnelle pour séparer les objets à durée de vie courte et longue.
Des benchmarks tels que SPECjbb 2015 démontrent des améliorations substantielles du débit et de la latence des algorithmes GC modernes depuis JDK 8 :
- GC Parallèle : 30 % d'amélioration du débit du JDK 8 au JDK 17.
- G1 GC : Amélioration de plus de 40 % du débit du JDK 8 au JDK 17.
- ZGC : 10% d'amélioration avec le mode générationnel dans JDK 21.
Temps de pause réduits
Les temps de pause ont été considérablement réduits sur tous les collecteurs :
- GC parallèle : De ~100 ms à ~65 ms.
- G1 GC : 40% de réduction du JDK 8 au JDK 17.
- ZGC : pauses inférieures à la milliseconde.
G1 GC a constaté des réductions significatives de la surcharge de mémoire native, grâce à des optimisations dans les ensembles mémorisés, les structures de données utilisées pour les collections basées sur les régions. Du JDK 8 au JDK 17, l'utilisation de la mémoire native du G1 a été réduite de près de moitié. Pour mieux illustrer les aspects pratiques du GC, considérons les exemples suivants :
Exemple 1 : configuration du G1 GC
# Add these options to your JVM startup command java -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -Xmx2g -Xms2g -jar app.jar
Cette configuration :
- Active le G1 GC.
- Définit un temps de pause maximum cible de 50 ms.
- Alloue 2 Go de mémoire tas.
Optimisation de ZGC pour les applications à faible latence
java -XX:+UseZGC -Xms4g -Xmx4g -XX:SoftRefLRUPolicyMSPerMB=50 -jar app.jar
Cette configuration :
- Utilise ZGC pour une latence ultra-faible.
- Alloue 4 Go de mémoire tas.
- Ajuste la durée de vie des références logicielles pour une meilleure gestion de la mémoire.
Défis de la migration au-delà de JDK 8
Bien que la mise à niveau du JDK 8 vers une version plus récente (par exemple, JDK 17 ou 21) puisse apporter des avantages significatifs, les développeurs doivent prendre en compte :
- Problèmes de compatibilité : Certaines bibliothèques ou frameworks peuvent ne pas prendre entièrement en charge les versions plus récentes du JDK.
- Réglage des performances : Chaque GC possède des paramètres de réglage spécifiques qui peuvent nécessiter un ajustement pour des performances optimales.
- Tests de l'environnement de préparation : effectuez toujours des tests approfondis dans des environnements de non-production avant de déployer les modifications.
Les progrès du garbage collection de Java depuis JDK 8 ont été remarquables. Avec des améliorations significatives en termes de débit, de latence et de surcharge de mémoire, la mise à niveau vers des versions plus récentes du JDK est nécessaire pour toute application Java.
Que vous utilisiez de petits conteneurs ou des services cloud à grande échelle, il existe un algorithme GC optimisé pour votre cas d'utilisation. Donc, si vous utilisez toujours le JDK 8, il est temps de faire le grand saut et de profiter des avantages en termes de performances du Java moderne.
Pour plus d'informations, regardez cette vidéo de Devoxx Belgium sur le Garbage Collection en Java : les progrès depuis le JDK 8 par Stefan Johansson
?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

JvmManagesgarBageCollectionACROSSPLATFORMSEFFECTIVELYBUSEUSAGENERATIONSPROACHANDADAPTINGTOOSANDHARDWAREDIFFERENCES.ITEPLOCHESSVARIEDSCOLLECTORSELESEERIAL, parallèle, CMS, etg1, chacun

Le code Java peut fonctionner sur différents systèmes d'exploitation sans modification, car la philosophie "écrire une fois, exécuter partout" de Java est implémentée par Java Virtual Machine (JVM). En tant qu'intermédiaire entre le bytecode Java compilé et le système d'exploitation, le JVM traduit le bytecode en instructions de machine spécifiques pour s'assurer que le programme peut s'exécuter indépendamment sur n'importe quelle plate-forme avec JVM installé.

La compilation et l'exécution des programmes Java réalisent l'indépendance de la plate-forme via ByteCode et JVM. 1) Écrivez le code source Java et compilez-le en bytecode. 2) Utilisez JVM pour exécuter ByteCode sur n'importe quelle plate-forme pour vous assurer que le code s'exécute sur les plates-formes.

Les performances de Java sont étroitement liées à l'architecture matérielle, et la compréhension de cette relation peut améliorer considérablement les capacités de programmation. 1) Le JVM convertit Java Bytecode en instructions de la machine via la compilation JIT, qui est affectée par l'architecture du CPU. 2) La gestion de la mémoire et la collecte des déchets sont affectés par la RAM et la vitesse du bus mémoire. 3) Prédiction de cache et de branche Optimiser l'exécution du code Java. 4) Le traitement multi-threading et parallèle améliore les performances sur les systèmes multi-fond.

L'utilisation de bibliothèques natives détruira l'indépendance de la plate-forme de Java, car ces bibliothèques doivent être compilées séparément pour chaque système d'exploitation. 1) La bibliothèque native interagit avec Java via JNI, fournissant des fonctions qui ne peuvent pas être directement implémentées par Java. 2) L'utilisation des bibliothèques natives augmente la complexité du projet et nécessite la gestion des fichiers de bibliothèque pour différentes plates-formes. 3) Bien que les bibliothèques natives puissent améliorer les performances, elles doivent être utilisées avec prudence et effectué des tests multiplateformes.

JVM gère les différences d'API du système d'exploitation via JavanativeInterface (JNI) et Java Standard Library: 1. JNI permet au code Java d'appeler le code local et d'interagir directement avec l'API du système d'exploitation. 2. La bibliothèque Java Standard fournit une API unifiée, qui est mappée en interne sur différentes API du système d'exploitation pour s'assurer que le code se déroule sur les plates-formes.

ModularityDoesNotDirectlyAffectedJava'splatformIndependence.java'splatformIndependensemAINENENEYBYTHEJVM, ButModularityInfluencesPlicationsStructureAndManagement, indirectly ImpactingPlatFatFindependence.1)

Bytecodeinjavaisheintermediaterepresentation the-steplatefortiveindependence.1) javacodeiscompilentocodedestoredin.classfiles.2) thejvMinterpretsorcompiltesthisbytecodeintomachinecotetruntime, permettant à la nom de codécodèdetorunonanydevicewithajvm, ainsi en nomycodetorunonananydevicewithajvm, ainsi.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

mPDF
mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

Version Mac de WebStorm
Outils de développement JavaScript utiles

Adaptateur de serveur SAP NetWeaver pour Eclipse
Intégrez Eclipse au serveur d'applications SAP NetWeaver.

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

VSCode Windows 64 bits Télécharger
Un éditeur IDE gratuit et puissant lancé par Microsoft
