Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
JooFlux at ComPAS 2013
Search
Julien Ponge
January 16, 2013
Research
480
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JooFlux at ComPAS 2013
Julien Ponge
January 16, 2013
More Decks by Julien Ponge
See All by Julien Ponge
Quarkus Insights 2023-03-06
jponge
0
130
Reactive Streams. 4 Interfaces. Et après ?
jponge
0
83
Scalability and resilience in practice: current trends and opportunities
jponge
0
320
Eclipse Vert.x at BruJUG 2019
jponge
0
220
Du réactif au service du pneu connecté
jponge
0
400
Bringing Reactive to Enterprise Java Developers
jponge
0
360
Golo LyonJUG 2019
jponge
0
320
Vert.x Montreal JUG 2018
jponge
0
560
Bringing Reactive to Enterprise Application Developer // Reactive Summit 2018
jponge
0
310
Other Decks in Research
See All in Research
【中間報告】国会議員の立法・政策実務を支える環境を巡る現状と課題
polipoli
0
810
A new deal for disabled people
resolutionfoundation
0
310
20260624 NLP colloquium: 単一のhubテキストがCLIPを壊す:hubnessによる埋め込みの脆弱性特定
de9uch1
2
310
Être éleveur dans un monde en transition : Comprendre les changements pour mieux les accompagner
institutdelelevage
PRO
0
140
2025年度秋葉原ウォーカブルプロジェクト調査報告 「アキバらしいウォーカブル」とは何か
izumiyama_lab
1
260
フィジカルAIの社会実装に向けて -AIエージェントからAgentic Roboticsへ-
hf149
1
2.4k
Hitting the buffers
beale
0
320
Détecter les vulnérabilités dans un environnement souverain
hellosct1
0
110
[最先端NLP勉強会2026] Checklists Are Better Than Reward Models For Aligning Language Models
nzw0301
1
340
第64回CV・PRML勉強会 論文紹介:Linguistic Priors for Visual Decoupling: Towards Symmetric Vision-Brain Alignment
sokikatayama
0
260
ICAITD 2026 Oral Presentation
rikkabotan7
0
120
GeoAgent勉強会 論文紹介と強い推論モデルが与えるインパクト
satai
5
410
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
950
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
300
Design in an AI World
tapps
1
360
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
280
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
530
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
59k
How to train your dragon (web standard)
notwaldorf
96
6.9k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
270
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
My Coaching Mixtape
mlcsv
0
360
Transcript
Julien Ponge Frédéric Le Mouël JooFlux ComPAS 2013
Objectifs JVM, invokedynamic Implémentation Évaluation Conclusions
“Modification de code à chaud et injection d’aspects directement dans
une JVM 7”
(démo)
AspectJ [Kiczales et al., 2001, CACM] Byteman [Dinn, 2011, AOSD]
Steamloom [Bockisch et al., 2004, AOSD] JnVM [Thomas et al., 2008, SP+E] JVolve [Subramanian et al., 2009, PLDI] SafeWeave [Würthinger et al., 2011, OOPSLA] Outils VMs ad-hoc Travaux connexes
Pas de langage d’aspects Pas de pré/post compilation Un agent
Java JVM non-modifiée JooFlux Dév appli Runtime
JVM, invokedynamic
Machine à pile OpCodes invocation de méthode manipulation de pile
get / set champs arithmétique allocation sauts lock (...) Constant pool (nombres, String, types) 0 java/lang/String 1 “Foo” 2 666 ... ... Variables locales 0 this (sauf static) 1 arg1 2 arg2 3 int i ... ...
invokestatic public static int add(int a, int b) invokevirtual public
int add(int a, int b) invokeinterface int add(int a, int b) invokespecial private int add(int a, int b)
Object call (Object receiver, Object[] args) throws Throwable; Object call
(Object receiver) throws Throwable; Object call (Object receiver, Object arg1) throws Throwable; Object call (Object receiver, Object arg1, Object arg2) throws Throwable; Object call (Object receiver, Object arg1, Object arg2, Object arg3) throws Throwable; Object call (Object receiver, Object arg1, Object arg2, Object arg3, Object arg4) throws Throwable; Object callConstructor (Object receiver, Object [] args) throws Throwable; Object callConstructor (Object receiver) throws Throwable; Object callConstructor (Object receiver, Object arg1) throws Throwable; Object callConstructor (Object receiver, Object arg1, Object arg2) throws Throwable; Object callConstructor (Object receiver, Object arg1, Object arg2, Object arg3) throws Throwable; Object callConstructor (Object receiver, Object arg1, Object arg2, Object arg3, Object arg4) throws Throwable; Comment résoudre à l’exécution ? (extrait de Groovy)
public Object call(Object receiver, Object[] args) throws Throwable { return
CallSiteArray.defaultCall(this, receiver, args); } public Object call(Object receiver) throws Throwable { return call(receiver, CallSiteArray.NOPARAM); } public Object call(Object receiver, Object arg1) throws Throwable { return call(receiver, ArrayUtil.createArray(arg1)); } public Object call(Object receiver, Object arg1, Object arg2) throws Throwable { return call(receiver, ArrayUtil.createArray(arg1, arg2)); } public Object call(Object receiver, Object arg1, Object arg2, Object arg3) throws Throwable { return call(receiver, ArrayUtil.createArray(arg1, arg2, arg3)); } public Object call(Object receiver, Object arg1, Object arg2, Object arg3, Object arg4) throws Throwable { return call(receiver, ArrayUtil.createArray(arg1, arg2, arg3, arg4)); } “Tous les chemins mènent à Rome”
public static Object invoke(Object object, String methodName, Object[] parameters) {
try { Class[] classTypes = new Class[parameters.length]; for (int i = 0; i < classTypes.length; i++) { classTypes[i] = parameters[i].getClass(); } Method method = object.getClass().getMethod(methodName, classTypes); return method.invoke(object, parameters); } catch (Throwable t) { return InvokerHelper.invokeMethod(object, methodName, parameters); } } Difficile pour le JIT ! CallSites génériques Réflexivité
invokedynamic nom symbolique + signature + bootstrap CallSite Constant Mutable
Volatile MethodHandle direct ou combinateurs branchements adaptation filtres (...) 7
Implémentation
1 2 3 4 Chargement des classes Interception Management Runtime
(...) ldc #3 ldc #5 invokedynamic foo (II)I bootstraper (...)
Call site JMX agent JooFlux bootstraper Modified bytecode Registry Target method combinators Load time action Run time action Original bytecode JVM agent 1 2 3 4
Réécriture de bytecode ASM + Agent Bootstrap JooFlux Casse la
vérification de bytecode ! 1
sémantique champ volatile impact mesuré négligeable VolatileCallSite 2
invokestatic invokespecial Method handle direct invokevirtual invokeinterface Method handle sur
le premier receveur 3
invokeinterface Polymorphic inline-cache guardWithTest(Class1, obj) guardWithTest(Class2, obj) fallback(callsite, args[]) Class1#foo(II)I
Class2#foo(II)I obj.foo(1, 2) 3
4 public interface JooFluxManagementMXBean { public String getName(); public int
getNumberOfRegisteredCallSites(); public Set<String> getRegisteredCallSiteKeys(); public String getCallSiteType(String target); public void changeCallSiteTarget(String methodType, String oldTarget, String newTarget); public void applyBeforeAspect(String callSitesKey, String aspectClass, String aspectMethod); public void applyAfterAspect(String callSitesKey, String aspectClass, String aspectMethod); }
(...) ldc #3 ldc #5 invokedynamic foo (II)I bootstraper (...)
Call site JMX agent JooFlux bootstraper Modified bytecode Registry Target method combinators Load time action Run time action Original bytecode JVM agent 4 Registre : 0 impact perfs Enregistré à la 1ère interception Modification via API
Évaluation
Interception / redirection de méthode Injection d’aspect ‘vide’ Langages dynamiques
Plates-formes AOP Micro Fibonacci(40) Macro SCImark Fork/Join Clojure Benchmarks X V V V
0 2 4 6 8 Byteman Jooflux Avant Après Avant
+ Après Injection d’aspect ‘vide’ x 137 x 134 x 306 x 6 x 2 x 5 Microbench
Interception/redirection méthode 0 5 10 15 Clojure JRuby Groovy Rhino
JS Jython Java+JooFlux Min Max x 1 x 48 x 18 x 15 x 2,2 x 10 x 3 x 6 x 1,2 x 2 Microbench
Interception/redirection méthode 0.9 1 1.1 SCIMark Fork/Join Clojure Min Max
x 0,99 x 0,97 x 1,04 x 0,93 x 1,01 x 1,01 Macrobench
Conclusion
JVM généraliste Interception à grain fin Résultats initiaux encourageants Approche
nouvelle, générique, sans langage dédié Bilan
Injection atomique multi-aspects Rollback / versioning Vérification formelle pré-injection Aspects
contextuels / Internet of Things Contrôle de ressources avec isolation adaptative Perspectives
https://github.com/dynamid/jooflux Questions / réponses Julien Ponge Frédéric Le Mouël http://dynamid.citi-lab.fr/