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
Scalability and resilience in practice: current trends and opportunities
jponge
0
140
Eclipse Vert.x at BruJUG 2019
jponge
0
150
Du réactif au service du pneu connecté
jponge
0
250
Bringing Reactive to Enterprise Java Developers
jponge
0
160
Golo LyonJUG 2019
jponge
0
130
Vert.x Montreal JUG 2018
jponge
0
210
Bringing Reactive to Enterprise Application Developer // Reactive Summit 2018
jponge
0
200
Démystifier le réactif et l'orchestration de services avec Vert.x, Kubernetes et Kotlin
jponge
0
180
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
PLDI '21論文読み会: DNNFusion: Accelerating Deep Neural Networks Execution with Advanced Operator Fusion
ideininc
0
690
BigQueryとPythonではじめるプロ野球選手の成績予測(もしくは成績占い) / Baseball Player Performance Prediction using BigQuery and Python
shinyorke
0
600
計算情報学研究室 (数理情報学第7研究室)紹介スライド
ssakaue
0
140
Symposium on Open Guidelines for RDTs - 1 - Welcome - Oxford OUCRU - Ona
pld
0
110
中国のオープンソースムーブメント:その現状と可能性 #中国オープンソース
takasumasakazu
2
640
企業研究者の生きる道 〜ネットワークエンジニアの場合〜
kikuzo
0
190
データサイエンティストと博士の専門性
mtakano
1
190
MioGatto による数式グラウンディング データセットの構築 / nlp2022
wtsnjp
0
140
自然言語処理とVision-and-Language / A Tutorial on NLP & Vision-and-Language
kyoun
13
6k
[輪講資料] Language-agnostic BERT Sentence Embedding
hpprc
1
840
PLDI '21論文読み会: Provable Repair of Deep Neural Networks
ideininc
0
740
ABCIで回そう爆速深層学習 (基礎編)
yoshipon
12
5.9k
Featured
See All Featured
The Language of Interfaces
destraynor
148
20k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
119
28k
jQuery: Nuts, Bolts and Bling
dougneiner
56
6.4k
Statistics for Hackers
jakevdp
781
210k
How To Stay Up To Date on Web Technology
chriscoyier
780
250k
Documentation Writing (for coders)
carmenhchung
48
2.6k
Visualization
eitanlees
125
11k
VelocityConf: Rendering Performance Case Studies
addyosmani
316
22k
The Straight Up "How To Draw Better" Workshop
denniskardys
225
120k
Writing Fast Ruby
sferik
612
57k
4 Signs Your Business is Dying
shpigford
169
20k
Pencils Down: Stop Designing & Start Developing
hursman
112
9.8k
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/