Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
JooFlux at ComPAS 2013
Julien Ponge
January 16, 2013
Research
0
380
JooFlux at ComPAS 2013
Julien Ponge
January 16, 2013
Tweet
Share
More Decks by Julien Ponge
See All by Julien Ponge
Reactive Streams. 4 Interfaces. Et après ?
jponge
0
5
Scalability and resilience in practice: current trends and opportunities
jponge
0
150
Eclipse Vert.x at BruJUG 2019
jponge
0
150
Du réactif au service du pneu connecté
jponge
0
260
Bringing Reactive to Enterprise Java Developers
jponge
0
200
Golo LyonJUG 2019
jponge
0
170
Vert.x Montreal JUG 2018
jponge
0
260
Bringing Reactive to Enterprise Application Developer // Reactive Summit 2018
jponge
0
210
Démystifier le réactif et l'orchestration de services avec Vert.x, Kubernetes et Kotlin
jponge
0
190
Other Decks in Research
See All in Research
Optimizing Electric Journal Subscriptions via Integer Programs
umepon
0
370
OpenPack Challenge 2022 - チュートリアル (日本語)
getty708
0
130
ランダム行列から深層学習へ
clustervr
PRO
0
470
サイボウズのUXリサーチャーについて
cybozuinsideout
PRO
0
390
セレンディピティはトキメキの夢を見せるか?
kuri8ive
1
770
理科の固有性に関する基礎的研究―「自然科学の性質」と「歴史学の性質」の比較を中心として―/Nature of School Science(Rika): A Comparison of "Nature of Science" and "Nature of History"
unzaih
0
110
kintone UXリサーチャーのお仕事紹介
cybozuinsideout
PRO
1
810
発話者分類研究の現状とその応用
yukizenimoto
0
240
Policy-Adaptive Estimator Selection for Off-Policy Evaluation
aiueola
0
360
世界観を考察するのが好き?Sound Horizonはいいぞ / Introduction to Sound Horizon
hyuyukun
0
790
[RecSys2022論文読み会]Bundle MCR: Towards Conversational Bundle Recommendation
okukenta
PRO
0
130
Federated Learning Tutorial (IBIS 2022)
osx
2
2.2k
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
117
15k
The Invisible Customer
myddelton
113
12k
Fireside Chat
paigeccino
16
1.8k
StorybookのUI Testing Handbookを読んだ
zakiyama
8
3.2k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
349
27k
Web Components: a chance to create the future
zenorocha
304
40k
Designing with Data
zakiwarfel
91
4.2k
Navigating Team Friction
lara
176
12k
Learning to Love Humans: Emotional Interface Design
aarron
263
38k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
224
50k
Creatively Recalculating Your Daily Design Routine
revolveconf
207
11k
Six Lessons from altMBA
skipperchong
15
2.3k
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/