BT

Diffuser les Connaissances et l'Innovation dans le Développement Logiciel d'Entreprise

Contribuez

Sujets

Sélectionner votre région

Accueil InfoQ Actualités Java 12 Est Sorti, Avec Un Switch Expérimental Et Le Ramasse-Miettes Shenandoah

Java 12 Est Sorti, Avec Un Switch Expérimental Et Le Ramasse-Miettes Shenandoah

Java 12, la dernière version de Java, a été publié à l'heure, ce 19 mars. On trouve plusieurs nouveautés et fonctionnalités intéressantes dans cette nouvelle version. En particulier, Java 12 intègre un nouvel élément de langage appelé Swith Expressions, disponible en préversion, et un nouveau ramasse-miettes appelé Shenandoah, également encore expérimental. On trouve également quelques améliorations du ramasse-miettes G1.

Suivant la nouvelle convention de nommage d'Oracle et le nouvelle cadence de publication, cette version arrive tout juste 6 mois après la publication de Java 11. Elle sera supportée durant les 6 mois qui viennent et ne bénéficiera pas d'un support à long terme (LTS).

Switch Expressions

Les Switch Expressions sont une nouveauté du langage qui reprend et améliore les clauses switch que l'on connait. Elles apportent une façon plus concise et moins verbeuse d'écrire une condition à plusieurs branches. Elles utilisent la nouvelle syntaxe suivante :

int value = switch (number) {
    case ONE   -> 1;
    case TWO   -> 2;
    case THREE -> 3;
};

On peut remarquer l'utilisation d'une flêche (->) la place des deux points (:) et l'absence de break. Les Switch Expressions ne définissent pas de clause par défaut. A la place, chaque label doit retourner une valeur et toutes les valeurs possibles de la variable testée doivent correspondre à une branche du switch.

Cela étant, la plupart des Switch Expressions auront besoin d'un label par défaut. Cependant, ce label par défaut peut être omis lorsque l'on écrit un switch sur une enum quand le switch couvre toutes les valeurs prises par cette enum. Tous les détails de cette nouvelles syntaxe ont été expliquées dans un récent article sur InfoQ.

Notons que les Switch Expressions ne sont disponible qu'en pré-version dans Java 12. Pour les utiliser dans un programme, vous devez ajouter le paramètre --enable-preview à javac lors de la phase de compilation.

Un nouveau ramasse-miettes : Shenandoah

Java 12 intégre un nouveau ramasse-miettes, Shenandoah, qui promet d'être un ramasse-miettes à faible temps d'interruption. Il exécute ses tâches (libération de la mémoire, marquage, compactage, etc...) dans des threads concurrents aux threads applicatifs utilisés par le programme Java. Ce faisant, le travail qui nécessite la mise en pause de l'application, doit prendre moins de temps.

Les applications qui doivent répondre très rapidement et en temps prédictible sont de bonnes candidates à l'utilisation de Shenandoah. Notons également que, selon l'équipe de Red Hat qui a développé Shenandoah : "les temps de pause de Shenandoah ne dépendant pas de la taille mémoire de l'application, ce qui signifie que vous aurez les mêmes temps de pause pour une application qui s'exécute dans 200Mo que dans 200Go". Cela dit, les performances globales dépendent tout de même de la quantité de mémoire allouée, et de la charge en calcul.

Shenandoah est encore actuellement expérimental et doit être activé avec l'option suivante : -XX:+UnlockExperimentalVMOptions. Red Hat est l'auteur de cette implémentation initiale et continuera à supporter Shenandoah sur les architectures aarch64 et amd64.

Améliorations des ramasses-miettes existants

Non seulement Java 12 apporte un nouveau ramasse-miettes, mais il améliore aussi les ramasses-miettes existants. Les JEP 344 et JEP 346 sont incluses dans cette version.

La première des deux, la JEP 344, améliore la façon dont le ramasse-miettes G1 atteint ses objectifs en matière de temps de pause lors de la libération de la mémoire. Le problème que cette JEP résout est qu'il arrive que G1 se trompe en choisissant la quantité de travail qu'il va faire dans son prochain cycle, ce qui amène des temps de pause plus longs que prévu. Dans ces cas, ces temps de pause ne peuvent pas être interrompus.

Pour améliorer ce point, le ramasse-miettes G1 détecte à présent lorsqu'il se trompe plusieurs fois et ajuste son travail en conséquence. Il fait cela en divisant ses tâches entre ce qui doit être obligatoirement fait, et ce qui est optionnel. Il peut ensuite décider de s'interrompre lorsqu'il exécute des tâches optionnelles.

La deuxième amélioration, la JEP 346, améliore la consommation mémoire de G1 en rendant la mémoire non utilisée au système d'exploitation durant ses périodes d'inactivité.

Avant cette amélioration, G1 ne rendait que rarement sa mémoire. En fait il ne le faisait que lors des phases de full GC. G1 met maintenant à profit de façon plus efficace ses temps d'inactivité pour rendre cette mémoire.

Améliorations supplémentaires

En plus des deux nouvelles fonctionnalités présentées ci-dessus, six nouveautés supplémentaires se trouvent dans Java 12 :

La distribution d'Oracle JDK 12 et d'Oracle OpenJDK 12 sont disponibles dès à présent. D'autres distributions seront disponibles rapidement.

Evaluer cet article

Pertinence
Style

Contenu Éducatif

BT