invokedynamic under the hood - oraclecr.openjdk.java.net/~ntv/talks/eclipsesummit16/indyunder...26...
TRANSCRIPT
invokedynamic under the hood
Nadeesh T V
ORACLE India Pvt Ltd
26 Aug 2016
JSR 292 invokedynamic under the hood
Outline
1 JVM Languages
2 PreInvokedynamic
3 Invokedynamic
4 MethodHandle
5 Summary
JSR 292 invokedynamic under the hood
JVM Languages
Languages which can run on Java Virtual Machine (JVM)
Should be a valid class file containing byte codes
More than 200+ JVM languages [1]
Java (primary language) [2]JRuby (ported version of Ruby)Jython (ported version of Python)JavaScriptGroovySmalltalkScala etc...
JSR 292 invokedynamic under the hood
JVM Languages
Semantics of other JVM languages differ from Java in many ways
Types can be dynamic
d e f sum ( a , b ) :t o t a l = a + br e t u r n t o t a l ;
Method invocation can be different
Smalltalk send messages for invocation
Scope, access rules can be different
JSR 292 invokedynamic under the hood
Non Java Language’s Overhead
Figure: NonJava languages on JVM
Wrapper layer adds performance overheads while running on JVM!!!
JSR 292 invokedynamic under the hood
NonJava Language’s Pain Points
NonJava compiler implementors have to write lot of code
JVM have to load lot of byte code (performance overhead)
Some of the dynamic languages heavily use Reflection (performanceoverhead) [3]
Every invocation requires an access checkMethod arguments are objects - boxing/unboxing
JSR 292 invokedynamic under the hood
NonJava Language’s Pain Points
Wrapper layer act as a black box which can affect JIT inlining!!!
v o i d method1 ( b o o l e a n ar g ) {i f ( a rg ) {
do . . . . .} e l s e {
do . . .}
}method1 ( f a l s e )
JSR 292 invokedynamic under the hood
Types of Method InvocationsBefore Java 7
invokestatic - Used to call static methods
s t a t i c v o i d s t a t i c M e t h o d ( ) {}
A . s t a t i c M e t h o d ( ) ;
Byte code of above invocation will be
i n v o k e s t a t i c #7 //Method s ta t i cMethod : ( )V
JSR 292 invokedynamic under the hood
Types of Method InvocationsBefore Java 7
invokevirtual - Used to call instance methods
v o i d i n s t a n c e M e t h o d ( ) {}
o b j . i n s t a n c e M e t h o d ( ) ;
Byte code of above invocation will be
i n v o k e v i r t u a l #4 // Method ins tanceMethod : ( )V
JSR 292 invokedynamic under the hood
Types of Method InvocationsBefore Java 7
invokeinterface - Use interface reference to call methods
L i s t l = new A r r a y L i s t ( ) ;l . add ( ”1” ) ;
Byte code of above invocation will be
i n v o k e i n t e r f a c e #10, 1// I n t e r f a c eMethod j a v a / u t i l / L i s t . add : ( L j ava / l ang /Object )Z
JSR 292 invokedynamic under the hood
Types of Method InvocationsBefore Java 7
invokespecial - Used to call private, constructors, super methods
p r i v a t e v o i d p r i v a t e M e t h o d ( ) {}
o b j . p r i v a t e M e t h o d ( ) ;
Byte code of above invocation will be
i n v o k e s p e c i a l #5 // Method pr i va teMethod : ( )V
JSR 292 invokedynamic under the hood
Types of Method InvocationsBefore Java 7
Figure: Summary of JVM bytecode invocations [2]
Receiver - Object in oop
Dispatch - Method searching and linking
JSR 292 invokedynamic under the hood
JSR 292: Supporting Dynamically Typed Languages on the Java Platform
Started in 2005
Feature Completed in 2011
Released in JDK 7
Key Features
New byte code -invokedynamic
New unit of behavior -methodhandle
JSR 292 invokedynamic under the hood
invokedynamic
Key Features
No receiver
Custom dispatching underuser control
Dynamic call sites can berelinked dynamically
JSR 292 invokedynamic under the hood
BootStrapping1st time invocation
Linking of a Dynamic Callsite (DC) to a method (One time activity)
Figure: Flow of BootStrapping [4]JSR 292 invokedynamic under the hood
BootStrap Method
Accept 3 Compulsory arguments
Byte code generator’s responsibility to link indy to BSM
Linking under user control !!!
JSR 292 invokedynamic under the hood
BootStrapping2nd time invocation
(No bootstrapping/linking)
Figure: Flow of BootStrapping [4]JSR 292 invokedynamic under the hood
BootStrap Method - Example
Runnable r = ( ) −> System . out . p r i n t l n ( ”” ) ;
Figure: Lambda expression byte code detailsImage adapted from [4]
JSR 292 invokedynamic under the hood
MethodHandle (MH)
”MethodHandle is a typed, directly executable reference toan underlying method, constructor, field”
MH can be considered as a function/field pointer
JSR 292 invokedynamic under the hood
Lookup
Contain access permission of a class
Should share only with trusted parties
Used in creating MethodHandle
Two types - publicLookup and lookup
In case of indy, JVM will pass lookup object to BSM
JSR 292 invokedynamic under the hood
MethodHandle - Usage
Create using
MethodHandles.Lookup (in Java)CONSTANT MethodHandle (in byte code)
MethodHandles . Lookup l oo k u p = MethodHandles . p u b l i c L o o k u p ( )
MethodHandle m = l o o k up . f i n d S t a t i c ( S t r i n g . c l a s s , ” v a l u e O f ” ,MethodType . methodType ( S t r i n g . c l a s s , c h a r . c l a s s ) ) ;
S t r i n g output = ( S t r i n g ) m. i n v o k e E x a c t ( ’ c ’ ) ;
JSR 292 invokedynamic under the hood
MethodHandle : Invocation
invokeExactArgument type should be exact matchIf no match, throw WrongMethodTypeException
invoke (invokeGeneric)Argument should be exact match/type converted match(boxing/unboxing, casting)If no match, throw WrongMethodTypeException
JSR 292 invokedynamic under the hood
MethodHandle - Lookup Failing Case
c l a s s B {p r i v a t e v o i d m( ) {}
}
p u b l i c c l a s s A {p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) throws Throwable {
MethodHandle m = MethodHandles . l o o k u p ( ) . f i n d S p e c i a l (B . c l a s s ,”m” ,MethodType . methodType ( v o i d . c l a s s ) , B . c l a s s ) ;
}}
Throws IllegalAccessException
JSR 292 invokedynamic under the hood
MethodHandle - Advantages
Access check only during creation of MH
No more access check during usage
No more boxing/unboxing overhead due tosignature polymorphic invocation
JSR 292 invokedynamic under the hood
Signature Polymorphism
”A signature polymorphic method is one which can operatewith any of a wide range of call signatures and return types.”
invoke/invokeExact are signature polymorphic
JSR 292 invokedynamic under the hood
CallSite (CS)
MethodHandle(MH) wrapped into CallSite
CS relink/retarget to different MH dynamically (setTarget)
CS is transparent to JIT and can optimistically inline through it
JSR 292 invokedynamic under the hood
Summary
Figure: Flow of BootStrapping [4]
JSR 292 invokedynamic under the hood
Acknowledgement
I would like to thank Vladimir Ivanov, Jamsheed CM (Oracle, Hotspotteam) for helping me in understanding invokedynamic.
JSR 292 invokedynamic under the hood
References
1. ”A Renaissance VM: One Platform, Many Languages”, JRose,JVMLS 2011
2. http://cr.openjdk.java.net/ jrose/pres/200910-VMIL.pdf
3.”Invokedynamic for Mere Mortals”, David Buck, JavaOne 2015
4.”http://cr.openjdk.java.net/ vlivanov/talks/2015-IndyDeepDive.pdf”,VIvanov
5.”http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html”,CNutter
JSR 292 invokedynamic under the hood
Thank you
JSR 292 invokedynamic under the hood
Types
Static - types determined at compile time
i n t x ;x = 2 ;x = ” h i ” ; // E r r o r
Dynamic - types determined at run time
x = 2 ;x = ” h i ” ; // Works
JSR 292 invokedynamic under the hood
Types
Weak - types can be mixed
$a =10;$b=”a” ;$c=$a . $b ;p r i n t $c ; #10a
$a =10;$b=”20 a” ;$c=$a+$b ;p r i n t $c ; #30
JSR 292 invokedynamic under the hood
Types
Strong - No implicit type conversion
x = 2 ;y = 2 + ” h i ” ; // E r r o r
References1. ”http://www.rubyfleebie.com/ruby-is-dynamically-and-strongly-typed/”2.”http://www.i-programmer.info/programming/theory/1469-type-systems-demystified-part2-weak-vs-strong.html”
JSR 292 invokedynamic under the hood