SlideShare uma empresa Scribd logo
1 de 65
Baixar para ler offline
1
Invokedynamic:
роскошь или необходимость?
Владимир Иванов
HotSpot JVM Compiler
Oracle
2
Что Вас ждет в ближайший час
§  invokedynamic (indy)
–  invoke, простите, что?!
§  Method handles (aka method pointers)
–  они-то тут причем?..
§  Детали-детали-детали
–  понемногу, но обо всем
3
Немного истории…
§  2011, July 28: Released as part of Java 7
§  2010: API refinement (e.g., BootstrapMethods)
§  2009: API refinement (e.g., CONSTANT_MethodHandle)
§  2008: API with Method Handles (Early Draft Review)
§  2007: Expert Group reboot
§  2006: JSR 292 Expert Group formed
§  2005: Initial design sketch
JSR 292: Supporting Dynamically Typed Languages on the Java Platform
4
Gilad Bracha
Java Language Architect,
Sun Microsystems, JAOO, 2005
“In summary, invokedynamic…
§  is a natural general purpose primitive
–  Not tied to semantics of a specific programming language
–  Flexible building block for a variety of method invocation semantics
§  enables relatively simple and efficient method dispatch.”
Что такое invokedynamic?
5
Gilad Bracha
Java Language Architect,
Sun Microsystems, JAOO, 2005
“In summary, invokedynamic…
§  is a natural general purpose primitive
–  Not tied to semantics of a specific programming language
–  Flexible building block for a variety of method invocation semantics
§  enables relatively simple and efficient method dispatch.”
Что такое indy?
6
JSR 292
§  Инструкция с программируемым поведением
–  полная свобода в выборе поведения JVM
§  Быстрые «указатели на методы» и адаптеры
§  Оптимизируется не хуже чем обычный Java код
§  Избежать модификаций в будущем
Нововведения
7
Ключевые нововведения
§  новая инструкция: invokedynamic.
–  линкуется под контролем пользователя
–  видимый пользователю объект: java.lang.invoke.CallSite
–  может быть слинкована и потом перелинкована
§  новый «атом» поведения: method handle
–  call site содержит ссылку на method handle
–  Method handle – указатель на метод для JVM
–  (или, каждый MH реализует интерфейс с одним методом)
8
Что такое indy?
invoke dynamic
user-def’d bytecode method pointers
9
Что такое indy?
invoke dynamic
bytecode +
bootstrap метод
method handles
10
Архитектура
Байткод
§ Байткод порождается
Java компиляторами
или «на лету».
11
Архитектура
Байткод
Динамические
call site’ы
§ Динамический call site
создается для каждой
инструкции invokedynamic.
§ Байткод порождается
Java компиляторами
или «на лету».
12
Архитектура
Method
handles
Байткод
Динамические
call site’ы
§ Динамический call site
создается для каждой
инструкции invokedynamic.
§ Каждый call site связан с одним
или более method handle’ом,
который указывает на некоторый
метод в байткоде.
§ Байткод порождается
Java компиляторами
или «на лету».
13
Архитектура
Method
handles
Байткод
Динамические
call site’ы
JVM
JIT
§ Динамический call site
создается для каждой
инструкции invokedynamic.
§ Каждый call site связан с одним
или более method handle’ом,
который указывает на некоторый
метод в байткоде.
§ Байткод порождается
Java компиляторами
или «на лету».
§ При необходимости,
JVM, прозрачно для
приложения,
оптимизирует в
машинный код.
14
invoke*
bytecode + bootstrap метод
15
Invokedynamic на уровне Java байткоде
§  Новая инструцкия
–  invokedynamic (0xBA)
§  Новые типы элементов в сonstant pool’е
–  CONSTANT_InvokeDynamic_info
–  CONSTANT_MethodHandle_info
–  CONSTANT_MethodType_info
§  улучшенный LDC
§  Атрибут BootstrapMethods
Изменения в структуре .class файлов
16
Invokedynamic
invokestatic invokespecial invokevirtual invokeinterface invokedynamic
no receiver no receiver receiver class receiver interface no receiver
no dispatch no dispatch single
dispatch
single dispatch custom
dispatch
Сравнение с другими invoke-инструкциями
17
Invokedynamic: логика работы
1й вызов
12: invokedynamic [#bsm] foo (“s”, 1, 3.14)
18
Invokedynamic: логика работы
1й вызов
Bootstrap метод
12: invokedynamic [#bsm] foo (“s”, 1, 3.14)
вызывает #bsm(…, “s”, 1, 3.14)
19
Invokedynamic: логика работы
1й вызов
CallSite
Bootstrap метод
12: invokedynamic [#bsm] foo (“s”, 1, 3.14)
вызывает #bsm(…, “s”, 1, 3.14)
возвращает
20
Invokedynamic: логика работы
1й вызов
CallSite
Bootstrap метод
12: invokedynamic [#bsm] foo (“s”, 1, 3.14)
MethodHandle
public Object foo(…) {…}
вызывает #bsm(…, “s”, 1, 3.14)
возвращает
указывающий на
который и вызывается!
21
Invokedynamic: логика работы
2й и последующие вызовы
CallSite
12: invokedynamic [#bsm] foo (“s”, 1, 3.14)
MethodHandle
public Object foo(…) {…}
указывающий на
извлекает MH из
22
Invokedynamic: логика работы
2й и последующие вызовы
CallSite
12: invokedynamic [#bsm] foo (“s”, 1, 3.14)
MethodHandle
public Object foo(…) {…}
указывающий на
извлекает MH из
или сразу вызывает
метод напрямую
23
Invokedynamic: логика работы
2й и последующие вызовы
24
Bootstrap метод
§  Изначально, каждый call site не слинкован
§  Сall site должен быть слинкован перед первым вызовом
–  может быть «лениво»
§  Линкуется посредством вызова bootstrap метода
–  которому передается статическая информация о call site’е
§  контекст, имя метода, сигнатура метода, дополнительные
параметры
–  возвращает объект типа CallSite, содержащий ссылку на метод
§  каждая invokedynamic инструцкия статически определяет свой
bootstrap метод (как ссылку в constant pool)
25
java.lang.invoke.CallSite
§  Объект, описывающий «место» вызова в коде
§  Хранит ссылку на метод («цель»), который должен вызываться
§  Линкуется с invokedynamic инструцией через bootstrap метод
§  Может быть нескольких типов
26
CallSite
§  ConstantCallSite
–  «цель» (method handle) после создания меняться не может
§  MutableCallSite
–  как обычное поле, хранящее ссылку на метод
–  делегирует каждый вызов текущему MH
§  VolatileCallSite
–  как volatile поле
–  изменения видны сразу
–  … за счет потенциального ухудшения производительности
Типы
27
Вызов через invokedynamic
§  Вызов метода через инструкцию invokedynamic быстр
–  всегда «точный»
§  типы параметров полностью совпадают
§  call site’ы строго типизированы
–  нет необходимости в проверке типа при вызове
§  VM гарантирует корректность
–  код, на который указывает method handle часто может быть
заинлайнен
28
invokedynamic
Пример: байткод
invokedynamic baz:(LSomeClass;ID)V [#bsm2, 1234.5]
29
invokedynamic
Пример: байткод
invokedynamic baz:(LSomeClass;ID)V [#bsm2, 1234.5]
static CallSite bsm2(Lookup lookup, String name, MethodType type, Object... arg) {
MethodHandle mh = lookup.findVirtual(SomeClass.class, name, type);
return new ConstantCallSite(mh);
}
30
invokedynamic
Пример: байткод
invokedynamic baz:(LSomeClass;ID)V [#bsm2, 1234.5]
static CallSite bsm2(Lookup lookup, String name, MethodType type, Object... arg) {
MethodHandle mh = lookup.findVirtual(SomeClass.class, name, type);
return new ConstantCallSite(mh);
}
== invokevirtual SomeClass.baz:(ID)V
31
*dynamic
Method Handles
32
Charles Oliver Nutter
JRuby Lead Developer
“The most fundamental change to Java since it’s
inception.”
Method Handles
33
Method Handles
§  Краеугольный камень для JSR 292
§  Основа для инструкции invokedynamic
§  Ключевая функциональность для других проектов
Что это?
34
Method Handles
§  Указатели на методы/поля/элементы массива
§  Манипуляция аргументами
§  Управляющая логика
§  Должно быть оптимизируемо JVM
–  это очень важно!
Что это?
35
Invoke инструкции
§  invoke*
invokevirtual java/io/PrintStream.println:()V
invokeinterface java/util/List.add:(Ljava/lang/Object;)Z
invokestatic java/lang/System.currentTimeMillis:()J
invokespecial java/lang/Object.<init>:()V
До JSR292
36
Invoke инструкции
§  invoke*
invokevirtual java/io/PrintStream.println:()V
invokeinterface java/util/List.add:(Ljava/lang/Object;)Z
invokestatic java/lang/System.currentTimeMillis:()J
invokespecial java/lang/Object.<init>:()V
§  обращение к полям
getfield, setfield, getstaticfield, setstaticfield
§  работа с массивами
*aload, *astore
И не только invoke*
37
Мethod Handles
§  Указатели на методы
–  findStatic, findVirtual, findSpecial, findConstructor
§  Указатели на поля
–  findGetter, findSetter, findStaticGetter, findStaticSetter
§  Указатели на элементы массива
–  arrayElementGetter, arrayElementSetter
Прямые указатели
38
Method Handles
§  insert, drop, permute
§  filter, fold, cast
§  spread (unbox varargs)
Манипулирование аргументами
39
Method Handles
§  guardWithTest: условный переход
–  комбинация 3х MH:
§  condition, true path, false path
§  SwitchPoint: on/off branch
–  комбинация 2х MH
§  true and false paths
–  Once off, always off
Flow control
40
Method Handles
§  catchException
–  body, exception type, handler
§  throwException
–  throws Throwable in argument 0
Работа с исключениями
41
Method Handles
§  Создание (direct MHs)
–  reflective factory API: MethodHandles.Lookup
–  ldc of CONSTANT_MethodHandle
–  special factories: identity, invoker
§  Трансформация/адаптация (bound or adapter MHs)
–  bindTo, insertArguments, guardWithTest, etc.
–  asType, filterArguments, etc.
§  Вызов (exact or inexact)
§  Линковка (invokedynamic call site или некоторая константа)
Жизненный цикл
42
Method Handles
§  Direct Method Handle указывает на Java метод.
–  может эмулировать существующие инструкции
§  Bound Method Handle хранит значение параметра
–  связанный аргумент указывается при создании
–  используется при каждом вызове
–  любой MH может быть связан и это не видно вызывающему
§  Adapter Method Handle преобразует значения «на лету»
–  как аргументы, так и возвращаемое значение
–  cast, box/unbox, collect/spread, filter, etc.
–  любой MH может быть адаптирован и это не видно вызывающему
Типы
43
44
Method Handles
§  При создании method handle’а осуществляется и связывание с
конкретным методом
§  Может быть медленным
–  делайте только один раз, если возможно
§  Используйте CONSTANT_MethodHandle
–  если генерируете байткод
Жизненный цикл: Создание
45
Method Handles
§  Осуществляется через методы, полиморфные относительно сигнатуры
§  Сигнатура метода определяется в месте вызова (call site)
§  Статически (в момент компиляции)
§  Например, MethodHandle.invoke()
–  (int)mh.invoke(1, 1L, new Object()) =>(int, long, Object)int
§  Сигнатура должна точно соответствовать типу MethodHandle’а
–  или нужно использовать invokeWithArgument
§  Помечены @SignaturePolymorphic в коде
Жизненный цикл: Вызов
46
Method Handles
§  «Точный» вызов (MH.invokeExact) прост
–  условный переход
–  немного дороже чем обычный виртуальный вызов.
§  «Неточный» вызов (MH.invoke) может быть сложен
–  если типы не совпадают
–  иначе как invokeExact
§  Вызов через invokedynamic инструкцию быстр
–  всегда «точен» (call site всегда строго типизирован)
–  код метода обычно инлайнится
Жизненный цикл: Вызов
47
Method Handles
§  Инструкция invokedynamic
–  call site с оптимистично предсказанным вызовом метода
–  предсказанный method handle предполагается константой
§  “static final” MH переменные рассматриваются как константы
§  Константные method handle’ы могут быть заинлайнены
–  может позволить избавиться от адаптеров и связанных аргументов
–  может продолжаться до прямых указателей на Java методы
Жизненный цикл: Связывание
48
Method Handles
§  MethodHandle
–  прямой указатель + различные адаптации
§  MethodType
–  сигнатура метода
§  MethodHandles.Lookup
–  конструирование method handle’ов
§  MethodHandles
–  набор вспомогательный функций для получения и адаптации method
handle’ов
Пакет java.lang.invoke
49
Method Handles
Примеры использования
MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
50
Method Handles
Примеры использования
MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
MethodHandle HASHCODE =
LOOKUP. findStatic(
System.class,
"identityHashCode",
MethodType.methodType(int.class, Object.class));
51
Method Handles
Примеры использования
MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
MethodHandle HASHCODE =
LOOKUP. findStatic(
System.class,
"identityHashCode",
MethodType.methodType(int.class, Object.class));
assertEquals(
System.identityHashCode("xy"),
(int) HASHCODE.invokeExact("xy"));
52
Method Handles
Примеры использования
MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
MethodHandle CONCAT =
LOOKUP. findVirtual(
String.class,
"concat",
MethodType.methodType(String.class, String.class));
53
Method Handles
Примеры использования
MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
MethodHandle CONCAT =
LOOKUP. findVirtual(
String.class,
"concat",
MethodType.methodType(String.class, String.class));
assertEquals("xy", (String) CONCAT.invokeExact("x", "y"));
54
Method Handles
Примеры использования
MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
MethodHandle CONCAT =
LOOKUP. findVirtual(
String.class,
"concat",
MethodType.methodType(String.class, String.class));
assertEquals("xy", (String) CONCAT.invokeExact("x", "y"));
MethodHandle CONCAT_x = CONCAT.bindTo(”x");
assertEquals(”xy", CONCAT_x.invoke(”y"));
55
Сравнение с Reflection API
§  Быстрее чем Reflection API
–  проверки прав доступа при каждом вызове не нужны
§  осуществляются при создании MH
–  цепочки MH хорошо инлайнятся
§  Удобнее чем Reflection API
–  комбинаторная библиотека для трансформации MH
–  точная типизация(по желанию)
56
Использование JSR292
§  JRuby
§  Project Lambda (Java 8)
§  Nashorn (Java 8)
Крупные проекты, активно использующие JSR292
57
Brian Goetz
Java Language Architect,
Oracle, April, 2012
“… We can achieve both of these goals [maximizing flexibility & providing
stability] by using the invokedynamic feature from JSR 292 to separate the
binary representation of lambda creation in the bytecode from the mechanics
of evaluating the lambda expression at runtime. The use of invokedynamic lets
us defer the selection of a translation strategy until run time. ”
Project Lambda (Java 8)
58
Brian Goetz
Java Language Architect,
Oracle, April, 2012
“… We can achieve both of these goals [maximizing flexibility & providing
stability] by using the invokedynamic feature from JSR 292 to separate the
binary representation of lambda creation in the bytecode from the mechanics
of evaluating the lambda expression at runtime. The use of invokedynamic
lets us defer the selection of a translation strategy until run time. ”
Project Lambda (Java 8)
59
“JDK8: Я, лямбда”
Сергей Куксенко, Алексей Шипилев, Oracle
сегодня, 16:45-17:45, зал «Moscow»
“JDK8: Молот лямбд”
Алексей Шипилев, Сергей Куксенко, Oracle
сегодня, 18:00-19:00, зал «Moscow»
Project Lambda (Java 8)
60
Итоги
§  Роскошь? Далеко не всегда!
§  Быстрее чем Reflection API
§  Удобнее чем Reflection API
61
Использование
§  invokedynamic доступна только на уровне байткода
–  через библиотеку ASM, например
§  … но method handle’ы можно использовать в обычном Java коде!
62
JIT-компилятор в JVM
глазами Java программиста
Владимир Иванов, Oracle
завтра, 10:45-11:45, зал «Moscow»
63
Вопросы?
vladimir.x.ivanov@oracle.com
@iwanowww
64
Graphic Section Divider
65

Mais conteúdo relacionado

Mais procurados

JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionNikita Lipsky
 
JVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииJVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииNikita Lipsky
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2Alexander Makarov
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Nikita Lipsky
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПzfconfua
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодRoman Grebennikov
 
AOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesAOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesNikita Lipsky
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотомRoman Grebennikov
 
UWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiUWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiAlexander Makarov
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Anton Arhipov
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - BytecodeAnton Arhipov
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Yulia Tsisyk
 
Модульная структура
Модульная структураМодульная структура
Модульная структураDenis Tsvettsih
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.Igor Shkulipa
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Кирилл Толкачёв
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 

Mais procurados (20)

JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
 
JVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииJVM: краткий курс общей анатомии
JVM: краткий курс общей анатомии
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
 
AOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesAOT для Java: Мифы и Challenges
AOT для Java: Мифы и Challenges
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
UWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiUWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем Yii
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - Bytecode
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 

Semelhante a "Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013

2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentAnton Kirillov
 
Проект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинПроект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинEYevseyeva
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Alexey Fyodorov
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераodnoklassniki.ru
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Magneta AI
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programmingAndrei Pangin
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 
Курс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. SpringКурс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. Spring7bits
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs ReflectionDenis Tsvettsih
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 

Semelhante a "Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013 (20)

2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Проект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинПроект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей Паньгин
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
In the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowelsIn the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowels
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервера
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 
Курс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. SpringКурс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. Spring
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 

Mais de Vladimir Ivanov

"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia "What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia Vladimir Ivanov
 
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,..."Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...Vladimir Ivanov
 
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine "Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine Vladimir Ivanov
 
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, UkraineVladimir Ivanov
 
JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013Vladimir Ivanov
 
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012Vladimir Ivanov
 
Управление памятью в Java: Footprint
Управление памятью в Java: FootprintУправление памятью в Java: Footprint
Управление памятью в Java: FootprintVladimir Ivanov
 
Многоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVMМногоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVMVladimir Ivanov
 
G1 GC: Garbage-First Garbage Collector
G1 GC: Garbage-First Garbage CollectorG1 GC: Garbage-First Garbage Collector
G1 GC: Garbage-First Garbage CollectorVladimir Ivanov
 
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)Vladimir Ivanov
 

Mais de Vladimir Ivanov (10)

"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia "What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
 
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,..."Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
 
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine "Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
 
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
 
JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013
 
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
 
Управление памятью в Java: Footprint
Управление памятью в Java: FootprintУправление памятью в Java: Footprint
Управление памятью в Java: Footprint
 
Многоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVMМногоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVM
 
G1 GC: Garbage-First Garbage Collector
G1 GC: Garbage-First Garbage CollectorG1 GC: Garbage-First Garbage Collector
G1 GC: Garbage-First Garbage Collector
 
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)
 

"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013

  • 2. 2 Что Вас ждет в ближайший час §  invokedynamic (indy) –  invoke, простите, что?! §  Method handles (aka method pointers) –  они-то тут причем?.. §  Детали-детали-детали –  понемногу, но обо всем
  • 3. 3 Немного истории… §  2011, July 28: Released as part of Java 7 §  2010: API refinement (e.g., BootstrapMethods) §  2009: API refinement (e.g., CONSTANT_MethodHandle) §  2008: API with Method Handles (Early Draft Review) §  2007: Expert Group reboot §  2006: JSR 292 Expert Group formed §  2005: Initial design sketch JSR 292: Supporting Dynamically Typed Languages on the Java Platform
  • 4. 4 Gilad Bracha Java Language Architect, Sun Microsystems, JAOO, 2005 “In summary, invokedynamic… §  is a natural general purpose primitive –  Not tied to semantics of a specific programming language –  Flexible building block for a variety of method invocation semantics §  enables relatively simple and efficient method dispatch.” Что такое invokedynamic?
  • 5. 5 Gilad Bracha Java Language Architect, Sun Microsystems, JAOO, 2005 “In summary, invokedynamic… §  is a natural general purpose primitive –  Not tied to semantics of a specific programming language –  Flexible building block for a variety of method invocation semantics §  enables relatively simple and efficient method dispatch.” Что такое indy?
  • 6. 6 JSR 292 §  Инструкция с программируемым поведением –  полная свобода в выборе поведения JVM §  Быстрые «указатели на методы» и адаптеры §  Оптимизируется не хуже чем обычный Java код §  Избежать модификаций в будущем Нововведения
  • 7. 7 Ключевые нововведения §  новая инструкция: invokedynamic. –  линкуется под контролем пользователя –  видимый пользователю объект: java.lang.invoke.CallSite –  может быть слинкована и потом перелинкована §  новый «атом» поведения: method handle –  call site содержит ссылку на method handle –  Method handle – указатель на метод для JVM –  (или, каждый MH реализует интерфейс с одним методом)
  • 8. 8 Что такое indy? invoke dynamic user-def’d bytecode method pointers
  • 9. 9 Что такое indy? invoke dynamic bytecode + bootstrap метод method handles
  • 11. 11 Архитектура Байткод Динамические call site’ы § Динамический call site создается для каждой инструкции invokedynamic. § Байткод порождается Java компиляторами или «на лету».
  • 12. 12 Архитектура Method handles Байткод Динамические call site’ы § Динамический call site создается для каждой инструкции invokedynamic. § Каждый call site связан с одним или более method handle’ом, который указывает на некоторый метод в байткоде. § Байткод порождается Java компиляторами или «на лету».
  • 13. 13 Архитектура Method handles Байткод Динамические call site’ы JVM JIT § Динамический call site создается для каждой инструкции invokedynamic. § Каждый call site связан с одним или более method handle’ом, который указывает на некоторый метод в байткоде. § Байткод порождается Java компиляторами или «на лету». § При необходимости, JVM, прозрачно для приложения, оптимизирует в машинный код.
  • 15. 15 Invokedynamic на уровне Java байткоде §  Новая инструцкия –  invokedynamic (0xBA) §  Новые типы элементов в сonstant pool’е –  CONSTANT_InvokeDynamic_info –  CONSTANT_MethodHandle_info –  CONSTANT_MethodType_info §  улучшенный LDC §  Атрибут BootstrapMethods Изменения в структуре .class файлов
  • 16. 16 Invokedynamic invokestatic invokespecial invokevirtual invokeinterface invokedynamic no receiver no receiver receiver class receiver interface no receiver no dispatch no dispatch single dispatch single dispatch custom dispatch Сравнение с другими invoke-инструкциями
  • 17. 17 Invokedynamic: логика работы 1й вызов 12: invokedynamic [#bsm] foo (“s”, 1, 3.14)
  • 18. 18 Invokedynamic: логика работы 1й вызов Bootstrap метод 12: invokedynamic [#bsm] foo (“s”, 1, 3.14) вызывает #bsm(…, “s”, 1, 3.14)
  • 19. 19 Invokedynamic: логика работы 1й вызов CallSite Bootstrap метод 12: invokedynamic [#bsm] foo (“s”, 1, 3.14) вызывает #bsm(…, “s”, 1, 3.14) возвращает
  • 20. 20 Invokedynamic: логика работы 1й вызов CallSite Bootstrap метод 12: invokedynamic [#bsm] foo (“s”, 1, 3.14) MethodHandle public Object foo(…) {…} вызывает #bsm(…, “s”, 1, 3.14) возвращает указывающий на который и вызывается!
  • 21. 21 Invokedynamic: логика работы 2й и последующие вызовы CallSite 12: invokedynamic [#bsm] foo (“s”, 1, 3.14) MethodHandle public Object foo(…) {…} указывающий на извлекает MH из
  • 22. 22 Invokedynamic: логика работы 2й и последующие вызовы CallSite 12: invokedynamic [#bsm] foo (“s”, 1, 3.14) MethodHandle public Object foo(…) {…} указывающий на извлекает MH из или сразу вызывает метод напрямую
  • 23. 23 Invokedynamic: логика работы 2й и последующие вызовы
  • 24. 24 Bootstrap метод §  Изначально, каждый call site не слинкован §  Сall site должен быть слинкован перед первым вызовом –  может быть «лениво» §  Линкуется посредством вызова bootstrap метода –  которому передается статическая информация о call site’е §  контекст, имя метода, сигнатура метода, дополнительные параметры –  возвращает объект типа CallSite, содержащий ссылку на метод §  каждая invokedynamic инструцкия статически определяет свой bootstrap метод (как ссылку в constant pool)
  • 25. 25 java.lang.invoke.CallSite §  Объект, описывающий «место» вызова в коде §  Хранит ссылку на метод («цель»), который должен вызываться §  Линкуется с invokedynamic инструцией через bootstrap метод §  Может быть нескольких типов
  • 26. 26 CallSite §  ConstantCallSite –  «цель» (method handle) после создания меняться не может §  MutableCallSite –  как обычное поле, хранящее ссылку на метод –  делегирует каждый вызов текущему MH §  VolatileCallSite –  как volatile поле –  изменения видны сразу –  … за счет потенциального ухудшения производительности Типы
  • 27. 27 Вызов через invokedynamic §  Вызов метода через инструкцию invokedynamic быстр –  всегда «точный» §  типы параметров полностью совпадают §  call site’ы строго типизированы –  нет необходимости в проверке типа при вызове §  VM гарантирует корректность –  код, на который указывает method handle часто может быть заинлайнен
  • 29. 29 invokedynamic Пример: байткод invokedynamic baz:(LSomeClass;ID)V [#bsm2, 1234.5] static CallSite bsm2(Lookup lookup, String name, MethodType type, Object... arg) { MethodHandle mh = lookup.findVirtual(SomeClass.class, name, type); return new ConstantCallSite(mh); }
  • 30. 30 invokedynamic Пример: байткод invokedynamic baz:(LSomeClass;ID)V [#bsm2, 1234.5] static CallSite bsm2(Lookup lookup, String name, MethodType type, Object... arg) { MethodHandle mh = lookup.findVirtual(SomeClass.class, name, type); return new ConstantCallSite(mh); } == invokevirtual SomeClass.baz:(ID)V
  • 32. 32 Charles Oliver Nutter JRuby Lead Developer “The most fundamental change to Java since it’s inception.” Method Handles
  • 33. 33 Method Handles §  Краеугольный камень для JSR 292 §  Основа для инструкции invokedynamic §  Ключевая функциональность для других проектов Что это?
  • 34. 34 Method Handles §  Указатели на методы/поля/элементы массива §  Манипуляция аргументами §  Управляющая логика §  Должно быть оптимизируемо JVM –  это очень важно! Что это?
  • 35. 35 Invoke инструкции §  invoke* invokevirtual java/io/PrintStream.println:()V invokeinterface java/util/List.add:(Ljava/lang/Object;)Z invokestatic java/lang/System.currentTimeMillis:()J invokespecial java/lang/Object.<init>:()V До JSR292
  • 36. 36 Invoke инструкции §  invoke* invokevirtual java/io/PrintStream.println:()V invokeinterface java/util/List.add:(Ljava/lang/Object;)Z invokestatic java/lang/System.currentTimeMillis:()J invokespecial java/lang/Object.<init>:()V §  обращение к полям getfield, setfield, getstaticfield, setstaticfield §  работа с массивами *aload, *astore И не только invoke*
  • 37. 37 Мethod Handles §  Указатели на методы –  findStatic, findVirtual, findSpecial, findConstructor §  Указатели на поля –  findGetter, findSetter, findStaticGetter, findStaticSetter §  Указатели на элементы массива –  arrayElementGetter, arrayElementSetter Прямые указатели
  • 38. 38 Method Handles §  insert, drop, permute §  filter, fold, cast §  spread (unbox varargs) Манипулирование аргументами
  • 39. 39 Method Handles §  guardWithTest: условный переход –  комбинация 3х MH: §  condition, true path, false path §  SwitchPoint: on/off branch –  комбинация 2х MH §  true and false paths –  Once off, always off Flow control
  • 40. 40 Method Handles §  catchException –  body, exception type, handler §  throwException –  throws Throwable in argument 0 Работа с исключениями
  • 41. 41 Method Handles §  Создание (direct MHs) –  reflective factory API: MethodHandles.Lookup –  ldc of CONSTANT_MethodHandle –  special factories: identity, invoker §  Трансформация/адаптация (bound or adapter MHs) –  bindTo, insertArguments, guardWithTest, etc. –  asType, filterArguments, etc. §  Вызов (exact or inexact) §  Линковка (invokedynamic call site или некоторая константа) Жизненный цикл
  • 42. 42 Method Handles §  Direct Method Handle указывает на Java метод. –  может эмулировать существующие инструкции §  Bound Method Handle хранит значение параметра –  связанный аргумент указывается при создании –  используется при каждом вызове –  любой MH может быть связан и это не видно вызывающему §  Adapter Method Handle преобразует значения «на лету» –  как аргументы, так и возвращаемое значение –  cast, box/unbox, collect/spread, filter, etc. –  любой MH может быть адаптирован и это не видно вызывающему Типы
  • 43. 43
  • 44. 44 Method Handles §  При создании method handle’а осуществляется и связывание с конкретным методом §  Может быть медленным –  делайте только один раз, если возможно §  Используйте CONSTANT_MethodHandle –  если генерируете байткод Жизненный цикл: Создание
  • 45. 45 Method Handles §  Осуществляется через методы, полиморфные относительно сигнатуры §  Сигнатура метода определяется в месте вызова (call site) §  Статически (в момент компиляции) §  Например, MethodHandle.invoke() –  (int)mh.invoke(1, 1L, new Object()) =>(int, long, Object)int §  Сигнатура должна точно соответствовать типу MethodHandle’а –  или нужно использовать invokeWithArgument §  Помечены @SignaturePolymorphic в коде Жизненный цикл: Вызов
  • 46. 46 Method Handles §  «Точный» вызов (MH.invokeExact) прост –  условный переход –  немного дороже чем обычный виртуальный вызов. §  «Неточный» вызов (MH.invoke) может быть сложен –  если типы не совпадают –  иначе как invokeExact §  Вызов через invokedynamic инструкцию быстр –  всегда «точен» (call site всегда строго типизирован) –  код метода обычно инлайнится Жизненный цикл: Вызов
  • 47. 47 Method Handles §  Инструкция invokedynamic –  call site с оптимистично предсказанным вызовом метода –  предсказанный method handle предполагается константой §  “static final” MH переменные рассматриваются как константы §  Константные method handle’ы могут быть заинлайнены –  может позволить избавиться от адаптеров и связанных аргументов –  может продолжаться до прямых указателей на Java методы Жизненный цикл: Связывание
  • 48. 48 Method Handles §  MethodHandle –  прямой указатель + различные адаптации §  MethodType –  сигнатура метода §  MethodHandles.Lookup –  конструирование method handle’ов §  MethodHandles –  набор вспомогательный функций для получения и адаптации method handle’ов Пакет java.lang.invoke
  • 50. 50 Method Handles Примеры использования MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); MethodHandle HASHCODE = LOOKUP. findStatic( System.class, "identityHashCode", MethodType.methodType(int.class, Object.class));
  • 51. 51 Method Handles Примеры использования MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); MethodHandle HASHCODE = LOOKUP. findStatic( System.class, "identityHashCode", MethodType.methodType(int.class, Object.class)); assertEquals( System.identityHashCode("xy"), (int) HASHCODE.invokeExact("xy"));
  • 52. 52 Method Handles Примеры использования MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); MethodHandle CONCAT = LOOKUP. findVirtual( String.class, "concat", MethodType.methodType(String.class, String.class));
  • 53. 53 Method Handles Примеры использования MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); MethodHandle CONCAT = LOOKUP. findVirtual( String.class, "concat", MethodType.methodType(String.class, String.class)); assertEquals("xy", (String) CONCAT.invokeExact("x", "y"));
  • 54. 54 Method Handles Примеры использования MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); MethodHandle CONCAT = LOOKUP. findVirtual( String.class, "concat", MethodType.methodType(String.class, String.class)); assertEquals("xy", (String) CONCAT.invokeExact("x", "y")); MethodHandle CONCAT_x = CONCAT.bindTo(”x"); assertEquals(”xy", CONCAT_x.invoke(”y"));
  • 55. 55 Сравнение с Reflection API §  Быстрее чем Reflection API –  проверки прав доступа при каждом вызове не нужны §  осуществляются при создании MH –  цепочки MH хорошо инлайнятся §  Удобнее чем Reflection API –  комбинаторная библиотека для трансформации MH –  точная типизация(по желанию)
  • 56. 56 Использование JSR292 §  JRuby §  Project Lambda (Java 8) §  Nashorn (Java 8) Крупные проекты, активно использующие JSR292
  • 57. 57 Brian Goetz Java Language Architect, Oracle, April, 2012 “… We can achieve both of these goals [maximizing flexibility & providing stability] by using the invokedynamic feature from JSR 292 to separate the binary representation of lambda creation in the bytecode from the mechanics of evaluating the lambda expression at runtime. The use of invokedynamic lets us defer the selection of a translation strategy until run time. ” Project Lambda (Java 8)
  • 58. 58 Brian Goetz Java Language Architect, Oracle, April, 2012 “… We can achieve both of these goals [maximizing flexibility & providing stability] by using the invokedynamic feature from JSR 292 to separate the binary representation of lambda creation in the bytecode from the mechanics of evaluating the lambda expression at runtime. The use of invokedynamic lets us defer the selection of a translation strategy until run time. ” Project Lambda (Java 8)
  • 59. 59 “JDK8: Я, лямбда” Сергей Куксенко, Алексей Шипилев, Oracle сегодня, 16:45-17:45, зал «Moscow» “JDK8: Молот лямбд” Алексей Шипилев, Сергей Куксенко, Oracle сегодня, 18:00-19:00, зал «Moscow» Project Lambda (Java 8)
  • 60. 60 Итоги §  Роскошь? Далеко не всегда! §  Быстрее чем Reflection API §  Удобнее чем Reflection API
  • 61. 61 Использование §  invokedynamic доступна только на уровне байткода –  через библиотеку ASM, например §  … но method handle’ы можно использовать в обычном Java коде!
  • 62. 62 JIT-компилятор в JVM глазами Java программиста Владимир Иванов, Oracle завтра, 10:45-11:45, зал «Moscow»
  • 65. 65