L’éditeur franco-américain ActiveViam apporte depuis plusieurs années une contribution directe aux capacités haute performance de Java qu’il utilise avec sa base de données in-memory ActivePivot. Cette collaboration lui donne une position particulière pour analyser les transformations apportées au langage open source. Antoine Chambille, directeur de la R&D d’ActiveViam, a vu suivi de près ces évolutions et voit se détacher de grandes tendances qu’il nous a détaillées lors d’un entretien dont le 1er volet a été publié fin mai. Le directeur R&D y abordait les efforts réalisés par l’équipe de Java pour ne pas se couper des nouvelles générations de développeurs, notamment avec une approche notebook et des variables non typées. Le 2ème volet de son analyse porte sur les avancées qui amènent Java « jusqu’au bout de la promesse du cloud », à travers la mutualisation des ressources matérielles. Les technologies de containers en font partie, qui permettent de gérer les applications au sein de conteneurs instanciés indépendamment des serveurs.
« C’est Java 10 qui a fait le 1er pas avec une bien meilleure intégration à Docker », rappelle Antoine Chambille. Avec les Control Groups, cette version du langage est beaucoup mieux alignée sur la façon dont les ressources Docker, donc la mémoire et le CPU, sont gérées dans Linux. « C’était un peu ignoré dans la JVM auparavant, ce qui conduisait à des configurations un peu compliquées où il fallait tout configurer deux fois », se souvient le directeur R&D. « Depuis Java 10, c’est fini, quand une machine virtuelle Java tourne dans Docker, elle le sait et elle s’aligne. On peut par exemple lui dire de prendre 80% de la mémoire du container, ainsi si l’on augmente la taille de celui-ci, la JVM grossit aussi. Ce n’était pas le cas jusque-là, auparavant, il aurait fallu penser à changer les deux paramétrages ».
Adapter Java au serverless
L’étape suivante, encore plus radicale que les containers sur la mutualisation avec la disparition même des serveurs dans le cloud, c’est la tendance serverless et les architectures lambda. « ça explose », constate le responsable du développement. En tant qu’éditeur, ActiveViam héberge son application ActivePivot dans le cloud pour ses clients et, pour bâtir cette plateforme, il a eu un recours massif au lambda. « C’est extrêmement pratique », affirme son directeur R&D en expliquant recourir au serverless sur les clouds d’AWS et de Microsoft (Azure Functions). « On écrit quelques lignes de code qui sont immédiatement disponibles avec une scalabilité qui va de zéro à l’infini ». Le serverless est conçu pour les petits traitements d’une à deux secondes. Java n’était pas vraiment adapté à cela parce qu’à chaque lancement de process, il faut lancer une JVM et charger les classes, ce qui peut prendre 5 secondes. Les développeurs du langage font donc beaucoup d’efforts pour que Java puisse être utilisé dans le cadre du serverless, c’est-à-dire qu’on puisse le lancer et qu’une demi-seconde plus tard, on l’éteigne parce que le service est fini. « Dans Java 10, des techniques ont été introduites pour que les classes qui sont chargées dans la JVM restent en mémoire, qu’elles soient prêtes pour la prochaine fois qu’on les appelle, y compris entre plusieurs applications différentes, c’est relativement sophistiqué », décrit Antoine Chambille. Pour lui, il est évident que cela a été fait pour qu’il soit possible de démarrer de nombreux runtimes Java de toute petite taille dans une architecture serverless.
Garbage Collector : de G1 à ZGC
Le 3ème grand domaine sur lequel Java continue à se développer, c’est la haute performance, sujet sur lequel l’éditeur ActiveViam a travaillé en direct avec les équipes d’Oracle. « Java a pour moi pratiquement remplacé le C et le C++ pour l’écriture des systèmes ou la haute performance », pose d’abord Antoine Chambille en évoquant l’adage « Java is the new C » qui s’est propagé il y a déjà quelques années lorsque le langage a pris le pas pour les développements proches du hardware. « Et c’est vrai qu’aujourd’hui toutes les stacks big data sont en Java et tournent sur des JVM, c’est assez étonnant », note le directeur R&D. « C’est un domaine qui nous passionne et c’est entre autres la performance de Java qui nous a permis de devenir un leader de l’analyse in-memory ». Commencé en Java 9, l’amélioration de l’algorithme de garbage collector G1 se poursuit (en français, on trouve parfois le terme de ramasse-miettes pour nommer cet algorithme de nettoyage de la mémoire).
Dans Java 10, avec l’aide d’ActiveViam, a été parallélisée une partie du code qui ne l’était pas encore. « C’est ce qu’on appelle le Full GC, c’est le moment où le Garbage Collector décide de tout nettoyer en une seule passe », rappelle le directeur R&D. Mais c’est aussi le moment où l’application est interrompue, mise en pause pendant que le nettoyage a lieu. « L’application se freeze, c’est ça le grand problème du Java sur les grandes mémoires. En Java 10, ils ont parallélisé ce code de sorte que, s’il y a 10 coeurs, cela va beaucoup plus vite et le temps où l’application est interrompue est beaucoup plus court ». Et il est possible qu’à partir de Java 11, le langage bénéficie d’un algorithme de garbage collection complètement réécrit, dénommé ZGC, Zero Garbage Collector. « C’est un algorithme assez différent, fait pour les serveurs modernes ayant énormément de mémoire et beaucoup de coeurs et qui devrait être capable de nettoyer la mémoire Java sans interrompre l’application, sans avoir besoin de faire des pauses dans le nettoyage de la mémoire ».
ZGC utilise les instructions spécialisées des processeurs
ActiveViam teste déjà le projet ZGC qui n’est pas forcément un remplacement de l’actuel algorithme. « C’est une nouvelle option, un nouveau choix, effectivement très prometteur, mais il n’est pas prêt », indique Antoine Chambille. Ainsi G1 qui avait été disponible vers la fin de Java 7 n’est devenu l’option par défaut qu’avec Java 9. Avec ZGC, « ils utilisent vraiment le hardware moderne et les instructions spécialisées des processeurs pour la synchronisation efficace des threads. C’est vraiment un magnifique morceau de logiciel et j’espère que sa 1ère version officielle sera Java 11 ». Il s’agit d’un algorithme tellement compliqué que les ingénieurs d’Oracle savent très bien qu’ils n’arriveront jamais à voir tous les problèmes à l’avance. Seul le temps et les retours leur permettront d’en prendre la mesure. « Ce n’est sans doute qu’au terme de plusieurs années seulement que toutes les zones d’ombre et tous les angles auront été traités dans ZGC, ce qui lui permettrait éventuellement de devenir l’unique garbage collector ».
Pour des spécialistes de la haute performance comme ActiveViam, le ZGC représente un avantage compétitif important. Ses clients utilisent ses solutions pour faire de l’analyse opérationnelle et prendre des décisions dans la journée, là où il y a quelques années, ils auraient fait un reporting pendant la nuit. « Ce sont des applications qui doivent fonctionner tout le temps car elles entraînent des prises de décision, ce peut être un trader qui mesure le risque que lui ferait encourir un nouveau trade et qui doit pouvoir juger si c’est acceptable ou pas ». Dans un autre domaine, la Fnac utilise ActiveViam pour faire du dynamic pricing. Les prix sont ajustés en fonction de différents critères. Auparavant, la chaîne de magasins spécialisés effectuait ses ajustements par mois ou trimestre. Avec ActivePivot, « elle écoute en permanence les prix de tous ses concurrents, fait tourner ses règles de pricing et peut être amenée éventuellement à changer des prix dans la journée. C’est de l’analyse opérationnelle qui colle aux métiers et aux décisions concrètes ». Pour l’éditeur de la base in-memory, le fait de collaborer avec Oracle sur Java lui permet d’avoir un support direct et pointu pour tester sans attendre des technologies comme le ZGC encore en cours de développement.
Projets Panama et Valhalla, des chantiers colossaux
Pour Java, d’autres évolutions très importantes sont en préparation sur la haute performance, tels que les projets Panama et Valhalla, encore au stade de recherche, qualifiés « de chantiers colossaux » par Antoine Chambille. Panama a pour objectif de faciliter l’interaction entre le code Java et les codes natifs en fait au sens large pour pouvoir tirer parti d’un matériel particulier dans une application haute performance. « Cela permettrait par exemple d’écrire un petit morceau de logiciel en C qui irait appeler depuis Java des instructions spécialisées haute performance, SIMD peut-être ». C’est déjà possible presque depuis le début de Java, mais compliqué, avec de gros problèmes de performances, explique le directeur R&D. Panama est dédié à remettre ça sur la table, mais pas avant Java 12. « Ce sera peut-être testable l’année prochaine ».
Le projet Valhalla est de son côté extrêmement ambitieux, parce qu’il vient des origines mêmes de Java. Son objectif est d’essayer de garder la lisibilité d’un code orienté objet (« ce qui était vraiment la promesse de Java au début, assez puriste au départ comme langage objet ») en reliant cela avec la performance d’un code machine. « C’est-à-dire d’être capable d’écrire du code avec des objets qui soit ensuite traduit par des types primitifs du processeur ou de la plateforme ». Java sait déjà passer d’un objet qui représente un nombre vers le type primitif qui représente un nombre. « Mais, précisément, il y a des conversions qui coûtent horriblement cher, surtout quand on commence à vouloir stocker des objets alors que l’on aurait pu stocker des tableaux de structures primitives ». Le responsable de la R&D d’ActiveViam donne l’exemple de morceaux du logiciel que son équipe développe qui ont dû être réécrits plusieurs fois pour obtenir la performance maximum : réécrits une fois pour les entiers, une fois pour les nombres décimaux, une fois pour les chaînes de caractères, etc. « Quelqu’un qui verrait ce code de l’extérieur pourrait nous dire : « Pourquoi ne pas l’avoir fait en langage objet, polymorphe ? La raison, c’est que la performance est impactée. Nous avons donc fait le choix d’un code plus difficile d’accès et plus long à maintenir ». Le projet Valhalla essaie d’aller vers une situation où l’on pourrait écrire en objet et retrouver la performance des types spécialisés. « Donc, c’est très très ambitieux », souligne Antoine Chambille en glissant qu’il n’est même pas entièrement sûr que l’équipe de Java y arrive.