Devoxx Repetita
Plus de 2500 participants, 250 présentations… la 4ème édition de Devoxx France, et la 3ème à laquelle je participe, a battu les records des éditions précédentes. Voici un résumé de quelques présentations auxquelles j’ai assisté.
ArrayList et LinkedList sont dans un bateau
Dans cette présentation de José Paumard, on apprend tout d’abord que, malgré ce que l’on nous enseigne sur les bancs de l’école sur les avantages théoriques des listes chaînées, même dans son cas le plus défavorable qui est l’insertion en tête de liste, l’ArrayList est très souvent le plus performant des deux, et cela grâce à la vitesse des opérations sur les emplacements consécutifs en mémoire dans les caches des processeurs. Pour nous démontrer cela, José nous montre les résultats de benchmarks réalisés à l’aide de JMH (Java Microbenchmark Harness), l’outil d’Aleksey Shipilev qui sera, on est heureux de l’apprendre, intégré au JDK9.
Dans une seconde partie, José nous montre comment tirer parti du cache processeur pour l’implémentation de cas particuliers de Set et de Map à un seul élément. Il obtient de meilleures performances que les classes génériques grâce à l’utilisation des lambdas.
Petit message personnel à l’intention de José : dans ton exemple sur les nouvelles fonctionnalités de Java 9, pour le symbole ‘::’, son nom, ‘NEKUDOTAYIM PAMAYIM’, n’est pas en langage extra-terrestre, mais en hébreu transcrit en alphabet latin.
OutOfMemoryException : Quel est le coût des objets en Java ?
Cette présentation nous informera sur la taille de nos objets en Java. Il faudra retenir que, même si les JVM 64 bits occupent plus de place en mémoire, l’activation du flag CompressedOOPS qui tire parti de l’alignement des Objets en mémoire sur des segments de 16 bits permettra de coder les références sur 32 bits pour les JVM avec des tailles inférieures à 32Go. Une sérieuse optimisation de taille mémoire.
J’y ai découvert un outil très utile : JOL, Java Object Layout, codé par Aleksey Shipilev (oui, le gars de JMH), et qui permet de découvrir avec précision la taille de nos objets.
String Concatenation de 1 à 9
Dans la première de ses deux présentations sur Java 9, Rémi Forax nous parle des grands chamboulements que va connaître la classe String. Sur un projet qui s’est étendu sur 5 années et mené par Aleksey Shipilev (décidément, encore lui), les Strings ne seront plus codées en interne dans un tableau de chars, mais dans un tableau de bytes. L’intérêt : les Strings ne contenant que des caractères de l’alphabet latin prendront deux fois moins de place en mémoire. Si vous avez déjà lancé un profiler sur une application Java, vous comprendrez vite les avantages à en tirer.
Le second grand changement concerne la concaténation des chaines de caractères. L’algorithme qui permet de mettre des chaînes bout à bout a changé à pratiquement chaque version de la JVM. La nouveauté dans le nouveau cru sera l’utilisation du byte code ‘invokedynamic’, qui permettra au JIT d’adapter l’algorithme à la volée en utilisant des heuristiques d’exécution en temps réel. Seul petit bémol pour profiter de cette amélioration: il faudra recompiler votre application avec une JDK 9.
Jigsaw est là pour nous sauver
Dans sa seconde présentation, Rémi Forax nous explique le fonctionnement des Modules qui seront introduits par le projet Jigsaw dans Java 9. Ils nous promettent de simplifier nos classpaths (et même de les supprimer), de réduire la taille de nos livrables (et de la JVM elle-même), et surtout de délivrer une meilleure sécurité. Il s’agit sûrement du changement le plus important sur l’écosystème Java de toute son histoire. Il n’y aura pas un outil qui ne sera impacté.
Heureusement, Oracle a prévu aussi bien les outils pour détecter les problèmes en avance de phase (jdep), que des portes de sorties pour contourner tous les problèmes de rétro-compatibilité à l’aide de flags en tout genre au lancement de la JVM.
La Blockchain en détail
Après une brève présentation du modèle de Bitcoin, on nous présente Ethereum, une plateforme où l’on peut nous même coder notre propre blockchain grâce à des Smart Contracts. On nous met aussi en garde contre le modèle du blockchain : en inscrivant dans le marbre notre code, il ne sera plus possible de revenir en arrière. Ainsi, même si l’auteur d’un code frauduleux se retrouve en prison, son code, lui, continuera de faire des dégâts.
Pourquoi Maurice ne doit surtout pas coder en go
On aura le droit à une présentation du langage Go par une personne qui n’est pas un évangéliste. Du coup, c’est un point de vue plus objectif où l’on nous met plutôt en garde : si vous ne pouvez pas vivre sans héritage, sans Exceptions, sans Maven ou sans tests unitaires, n’y pensez même pas…
Stack Overflow behind the scenes – how it’s made
Cette présentation sur l’architecture globale du célèbre site nous montre surtout que les bases de données relationnelles ont toujours de beaux jours devant elles… à condition d’être bien outillé !
Résoudre le puzzle Jigsaw avec Gradle
Gradle se prépare à Java 9, et introduit un système de Modules avant l’heure, pour faciliter la transition le moment venu.
Le réveil de la Thread
Pour finir, je me dois de parler de ma propre présentation. En effet, pour la première fois, je ne participais pas à une conférence en tant que simple spectateur. Pour une conférence dont les sujets sont souvent à la mode (automation, virtualisation, Big Data..), j’ai trouvé assez sympathique que le comité de décision ait accepté une présentation sur un sujet aussi rétro que les Threads. Je trouverai encore plus sympathique si j’entendais un jour quelqu’un utiliser le nom d’un de mes patterns : « Pourquoi tu n’introduirais pas un Marsupilami ? », ou bien « Tu as fait attention à Godzilla ? ».
Un petit regret, je n’ai pas eu le temps de m’étendre sur l’une de mes dernières slides. Mais ce n’était pas de ma faute : si vous me voyez dans le début de ma présentation passer une minute à regarder sur ma droite, c’est Audrey Neveu qui s’essayait à l’électronique… Quoi qu’il en soit, pour ceux que ça intéresse, l’Executor à utiliser pour les tests unitaires, qui ne lance pas de Threads, s’écrit comme suit :
Executor testExecutor = new Executor() {
public void execute(Runnable runnable) {
runnable.run();
}
};
La méthode run() du Runnable est exécutée sans utiliser de Thread. En utilisant les lambdas de Java 8, tout ça peut se simplifier comme suit :
Executor testExecutor = runnable -> runnable.run() ;
Enfin, si comme moi vous aimez les références de méthodes, on peut appliquer une simplification supplémentaire, qui est le code que vous voyez sur ma slide:
Executor testExecutor = Runnable::run;
J’en profite pour glisser un petit merci à ceux qui m’ont aidé à la préparation de la présentation: Clément (qui se l’est tapé trois fois), Florian (merci pour le sac), Pierre, Adrien, Sofiann (je n’ai toujours pas utilisé mes mains), Cyril, Renaud, Meïr (soutien du premier rang), Saad, Andri, Sandrine (les slides sont trop beaux !), Elise, Laure, et d’autres que j’ai dû oublier.
Tant qu’à faire, j’en profite pour glisser un petit coucou. On passe son temps à courir de salle en salle, et on n’a pas toujours le temps de discuter avec d’anciennes connaissances. Donc coucou à Jérôme, Christophe (désolé, j’ai raté ta meuleuse), Gaétan, Nicolas et Jérémy.