1Invokedynamic:роскошь или необходимость?Владимир ИвановHotSpot JVM CompilerOracle
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: A...
4Gilad BrachaJava Language Architect,Sun Microsystems, JAOO, 2005“In summary, invokedynamic…§  is a natural general purpo...
5Gilad BrachaJava Language Architect,Sun Microsystems, JAOO, 2005“In summary, invokedynamic…§  is a natural general purpo...
6JSR 292§  Инструкция с программируемым поведением–  полная свобода в выборе поведения JVM§  Быстрые «указатели на метод...
7Ключевые нововведения§  новая инструкция: invokedynamic.–  линкуется под контролем пользователя–  видимый пользователю о...
8Что такое indy?invoke dynamicuser-def’d bytecode method pointers
9Что такое indy?invoke dynamicbytecode +bootstrap методmethod handles
10АрхитектураБайткод§ Байткод порождаетсяJava компиляторамиили «на лету».
11АрхитектураБайткодДинамическиеcall site’ы§ Динамический call siteсоздается для каждойинструкции invokedynamic.§ Байтко...
12АрхитектураMethodhandlesБайткодДинамическиеcall site’ы§ Динамический call siteсоздается для каждойинструкции invokedyna...
13АрхитектураMethodhandlesБайткодДинамическиеcall site’ыJVMJIT§ Динамический call siteсоздается для каждойинструкции invo...
14invoke*bytecode + bootstrap метод
15Invokedynamic на уровне Java байткоде§  Новая инструцкия–  invokedynamic (0xBA)§  Новые типы элементов в сonstant pool...
16Invokedynamicinvokestatic invokespecial invokevirtual invokeinterface invokedynamicno receiver no receiver receiver clas...
17Invokedynamic: логика работы1й вызов12: invokedynamic [#bsm] foo (“s”, 1, 3.14)
18Invokedynamic: логика работы1й вызовBootstrap метод12: invokedynamic [#bsm] foo (“s”, 1, 3.14)вызывает #bsm(…, “s”, 1, 3...
19Invokedynamic: логика работы1й вызовCallSiteBootstrap метод12: invokedynamic [#bsm] foo (“s”, 1, 3.14)вызывает #bsm(…, “...
20Invokedynamic: логика работы1й вызовCallSiteBootstrap метод12: invokedynamic [#bsm] foo (“s”, 1, 3.14)MethodHandlepublic...
21Invokedynamic: логика работы2й и последующие вызовыCallSite12: invokedynamic [#bsm] foo (“s”, 1, 3.14)MethodHandlepublic...
22Invokedynamic: логика работы2й и последующие вызовыCallSite12: invokedynamic [#bsm] foo (“s”, 1, 3.14)MethodHandlepublic...
23Invokedynamic: логика работы2й и последующие вызовы
24Bootstrap метод§  Изначально, каждый call site не слинкован§  Сall site должен быть слинкован перед первым вызовом–  м...
25java.lang.invoke.CallSite§  Объект, описывающий «место» вызова в коде§  Хранит ссылку на метод («цель»), который долже...
26CallSite§  ConstantCallSite–  «цель» (method handle) после создания меняться не может§  MutableCallSite–  как обычное ...
27Вызов через invokedynamic§  Вызов метода через инструкцию invokedynamic быстр–  всегда «точны黧  типы параметров полн...
28invokedynamicПример: байткодinvokedynamic baz:(LSomeClass;ID)V [#bsm2, 1234.5]
29invokedynamicПример: байткодinvokedynamic baz:(LSomeClass;ID)V [#bsm2, 1234.5]static CallSite bsm2(Lookup lookup, String...
30invokedynamicПример: байткодinvokedynamic baz:(LSomeClass;ID)V [#bsm2, 1234.5]static CallSite bsm2(Lookup lookup, String...
31*dynamicMethod Handles
32Charles Oliver NutterJRuby Lead Developer“The most fundamental change to Java since it’sinception.”Method Handles
33Method Handles§  Краеугольный камень для JSR 292§  Основа для инструкции invokedynamic§  Ключевая функциональность дл...
34Method Handles§  Указатели на методы/поля/элементы массива§  Манипуляция аргументами§  Управляющая логика§  Должно б...
35Invoke инструкции§  invoke*invokevirtual java/io/PrintStream.println:()Vinvokeinterface java/util/List.add:(Ljava/lang/...
36Invoke инструкции§  invoke*invokevirtual java/io/PrintStream.println:()Vinvokeinterface java/util/List.add:(Ljava/lang/...
37Мethod Handles§  Указатели на методы–  findStatic, findVirtual, findSpecial, findConstructor§  Указатели на поля–  fin...
38Method Handles§  insert, drop, permute§  filter, fold, cast§  spread (unbox varargs)Манипулирование аргументами
39Method Handles§  guardWithTest: условный переход–  комбинация 3х MH:§  condition, true path, false path§  SwitchPoint...
40Method Handles§  catchException–  body, exception type, handler§  throwException–  throws Throwable in argument 0Работ...
41Method Handles§  Создание (direct MHs)–  reflective factory API: MethodHandles.Lookup–  ldc of CONSTANT_MethodHandle–  ...
42Method Handles§  Direct Method Handle указывает на Java метод.–  может эмулировать существующие инструкции§  Bound Met...
43
44Method Handles§  При создании method handle’а осуществляется и связывание сконкретным методом§  Может быть медленным– ...
45Method Handles§  Осуществляется через методы, полиморфные относительно сигнатуры§  Сигнатура метода определяется в мес...
46Method Handles§  «Точный» вызов (MH.invokeExact) прост–  условный переход–  немного дороже чем обычный виртуальный вызо...
47Method Handles§  Инструкция invokedynamic–  call site с оптимистично предсказанным вызовом метода–  предсказанный metho...
48Method Handles§  MethodHandle–  прямой указатель + различные адаптации§  MethodType–  сигнатура метода§  MethodHandle...
49Method HandlesПримеры использованияMethodHandles.Lookup LOOKUP = MethodHandles.lookup();
50Method HandlesПримеры использованияMethodHandles.Lookup LOOKUP = MethodHandles.lookup();MethodHandle HASHCODE =LOOKUP. f...
51Method HandlesПримеры использованияMethodHandles.Lookup LOOKUP = MethodHandles.lookup();MethodHandle HASHCODE =LOOKUP. f...
52Method HandlesПримеры использованияMethodHandles.Lookup LOOKUP = MethodHandles.lookup();MethodHandle CONCAT =LOOKUP. fin...
53Method HandlesПримеры использованияMethodHandles.Lookup LOOKUP = MethodHandles.lookup();MethodHandle CONCAT =LOOKUP. fin...
54Method HandlesПримеры использованияMethodHandles.Lookup LOOKUP = MethodHandles.lookup();MethodHandle CONCAT =LOOKUP. fin...
55Сравнение с Reflection API§  Быстрее чем Reflection API–  проверки прав доступа при каждом вызове не нужны§  осуществл...
56Использование JSR292§  JRuby§  Project Lambda (Java 8)§  Nashorn (Java 8)Крупные проекты, активно использующие JSR292
57Brian GoetzJava Language Architect,Oracle, April, 2012“… We can achieve both of these goals [maximizing flexibility & pr...
58Brian GoetzJava Language Architect,Oracle, April, 2012“… We can achieve both of these goals [maximizing flexibility & pr...
59“JDK8: Я, лямбда”Сергей Куксенко, Алексей Шипилев, Oracleсегодня, 16:45-17:45, зал «Moscow»“JDK8: Молот лямбд”Алексей Ши...
60Итоги§  Роскошь? Далеко не всегда!§  Быстрее чем Reflection API§  Удобнее чем Reflection API
61Использование§  invokedynamic доступна только на уровне байткода–  через библиотеку ASM, например§  … но method handle...
62JIT-компилятор в JVMглазами Java программистаВладимир Иванов, Oracleзавтра, 10:45-11:45, зал «Moscow»
63Вопросы?vladimir.x.ivanov@oracle.com@iwanowww
64Graphic Section Divider
65
Upcoming SlideShare
Loading in …5
×

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

2,666
-1

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,666
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
37
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. 1Invokedynamic:роскошь или необходимость?Владимир ИвановHotSpot JVM CompilerOracle
  2. 2. 2Что Вас ждет в ближайший час§  invokedynamic (indy)–  invoke, простите, что?!§  Method handles (aka method pointers)–  они-то тут причем?..§  Детали-детали-детали–  понемногу, но обо всем
  3. 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 sketchJSR 292: Supporting Dynamically Typed Languages on the Java Platform
  4. 4. 4Gilad BrachaJava 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. 5Gilad BrachaJava 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. 6JSR 292§  Инструкция с программируемым поведением–  полная свобода в выборе поведения JVM§  Быстрые «указатели на методы» и адаптеры§  Оптимизируется не хуже чем обычный Java код§  Избежать модификаций в будущемНововведения
  7. 7. 7Ключевые нововведения§  новая инструкция: invokedynamic.–  линкуется под контролем пользователя–  видимый пользователю объект: java.lang.invoke.CallSite–  может быть слинкована и потом перелинкована§  новый «атом» поведения: method handle–  call site содержит ссылку на method handle–  Method handle – указатель на метод для JVM–  (или, каждый MH реализует интерфейс с одним методом)
  8. 8. 8Что такое indy?invoke dynamicuser-def’d bytecode method pointers
  9. 9. 9Что такое indy?invoke dynamicbytecode +bootstrap методmethod handles
  10. 10. 10АрхитектураБайткод§ Байткод порождаетсяJava компиляторамиили «на лету».
  11. 11. 11АрхитектураБайткодДинамическиеcall site’ы§ Динамический call siteсоздается для каждойинструкции invokedynamic.§ Байткод порождаетсяJava компиляторамиили «на лету».
  12. 12. 12АрхитектураMethodhandlesБайткодДинамическиеcall site’ы§ Динамический call siteсоздается для каждойинструкции invokedynamic.§ Каждый call site связан с однимили более method handle’ом,который указывает на некоторыйметод в байткоде.§ Байткод порождаетсяJava компиляторамиили «на лету».
  13. 13. 13АрхитектураMethodhandlesБайткодДинамическиеcall site’ыJVMJIT§ Динамический call siteсоздается для каждойинструкции invokedynamic.§ Каждый call site связан с однимили более method handle’ом,который указывает на некоторыйметод в байткоде.§ Байткод порождаетсяJava компиляторамиили «на лету».§ При необходимости,JVM, прозрачно дляприложения,оптимизирует вмашинный код.
  14. 14. 14invoke*bytecode + bootstrap метод
  15. 15. 15Invokedynamic на уровне Java байткоде§  Новая инструцкия–  invokedynamic (0xBA)§  Новые типы элементов в сonstant pool’е–  CONSTANT_InvokeDynamic_info–  CONSTANT_MethodHandle_info–  CONSTANT_MethodType_info§  улучшенный LDC§  Атрибут BootstrapMethodsИзменения в структуре .class файлов
  16. 16. 16Invokedynamicinvokestatic invokespecial invokevirtual invokeinterface invokedynamicno receiver no receiver receiver class receiver interface no receiverno dispatch no dispatch singledispatchsingle dispatch customdispatchСравнение с другими invoke-инструкциями
  17. 17. 17Invokedynamic: логика работы1й вызов12: invokedynamic [#bsm] foo (“s”, 1, 3.14)
  18. 18. 18Invokedynamic: логика работы1й вызовBootstrap метод12: invokedynamic [#bsm] foo (“s”, 1, 3.14)вызывает #bsm(…, “s”, 1, 3.14)
  19. 19. 19Invokedynamic: логика работы1й вызовCallSiteBootstrap метод12: invokedynamic [#bsm] foo (“s”, 1, 3.14)вызывает #bsm(…, “s”, 1, 3.14)возвращает
  20. 20. 20Invokedynamic: логика работы1й вызовCallSiteBootstrap метод12: invokedynamic [#bsm] foo (“s”, 1, 3.14)MethodHandlepublic Object foo(…) {…}вызывает #bsm(…, “s”, 1, 3.14)возвращаетуказывающий накоторый и вызывается!
  21. 21. 21Invokedynamic: логика работы2й и последующие вызовыCallSite12: invokedynamic [#bsm] foo (“s”, 1, 3.14)MethodHandlepublic Object foo(…) {…}указывающий наизвлекает MH из
  22. 22. 22Invokedynamic: логика работы2й и последующие вызовыCallSite12: invokedynamic [#bsm] foo (“s”, 1, 3.14)MethodHandlepublic Object foo(…) {…}указывающий наизвлекает MH изили сразу вызываетметод напрямую
  23. 23. 23Invokedynamic: логика работы2й и последующие вызовы
  24. 24. 24Bootstrap метод§  Изначально, каждый call site не слинкован§  Сall site должен быть слинкован перед первым вызовом–  может быть «ленив  Линкуется посредством вызова bootstrap метода–  которому передается статическая информация о call site’е§  контекст, имя метода, сигнатура метода, дополнительныепараметры–  возвращает объект типа CallSite, содержащий ссылку на метод§  каждая invokedynamic инструцкия статически определяет свойbootstrap метод (как ссылку в constant pool)
  25. 25. 25java.lang.invoke.CallSite§  Объект, описывающий «место» вызова в коде§  Хранит ссылку на метод («цель»), который должен вызываться§  Линкуется с invokedynamic инструцией через bootstrap метод§  Может быть нескольких типов
  26. 26. 26CallSite§  ConstantCallSite–  «цель» (method handle) после создания меняться не может§  MutableCallSite–  как обычное поле, хранящее ссылку на метод–  делегирует каждый вызов текущему MH§  VolatileCallSite–  как volatile поле–  изменения видны сразу–  … за счет потенциального ухудшения производительностиТипы
  27. 27. 27Вызов через invokedynamic§  Вызов метода через инструкцию invokedynamic быстр–  всегда «точны黧  типы параметров полностью совпадают§  call site’ы строго типизированы–  нет необходимости в проверке типа при вызове§  VM гарантирует корректность–  код, на который указывает method handle часто может бытьзаинлайнен
  28. 28. 28invokedynamicПример: байткодinvokedynamic baz:(LSomeClass;ID)V [#bsm2, 1234.5]
  29. 29. 29invokedynamicПример: байткод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. 30invokedynamicПример: байткод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. 31. 31*dynamicMethod Handles
  32. 32. 32Charles Oliver NutterJRuby Lead Developer“The most fundamental change to Java since it’sinception.”Method Handles
  33. 33. 33Method Handles§  Краеугольный камень для JSR 292§  Основа для инструкции invokedynamic§  Ключевая функциональность для других проектовЧто это?
  34. 34. 34Method Handles§  Указатели на методы/поля/элементы массива§  Манипуляция аргументами§  Управляющая логика§  Должно быть оптимизируемо JVM–  это очень важно!Что это?
  35. 35. 35Invoke инструкции§  invoke*invokevirtual java/io/PrintStream.println:()Vinvokeinterface java/util/List.add:(Ljava/lang/Object;)Zinvokestatic java/lang/System.currentTimeMillis:()Jinvokespecial java/lang/Object.<init>:()VДо JSR292
  36. 36. 36Invoke инструкции§  invoke*invokevirtual java/io/PrintStream.println:()Vinvokeinterface java/util/List.add:(Ljava/lang/Object;)Zinvokestatic java/lang/System.currentTimeMillis:()Jinvokespecial java/lang/Object.<init>:()V§  обращение к полямgetfield, setfield, getstaticfield, setstaticfield§  работа с массивами*aload, *astoreИ не только invoke*
  37. 37. 37Мethod Handles§  Указатели на методы–  findStatic, findVirtual, findSpecial, findConstructor§  Указатели на поля–  findGetter, findSetter, findStaticGetter, findStaticSetter§  Указатели на элементы массива–  arrayElementGetter, arrayElementSetterПрямые указатели
  38. 38. 38Method Handles§  insert, drop, permute§  filter, fold, cast§  spread (unbox varargs)Манипулирование аргументами
  39. 39. 39Method Handles§  guardWithTest: условный переход–  комбинация 3х MH:§  condition, true path, false path§  SwitchPoint: on/off branch–  комбинация 2х MH§  true and false paths–  Once off, always offFlow control
  40. 40. 40Method Handles§  catchException–  body, exception type, handler§  throwException–  throws Throwable in argument 0Работа с исключениями
  41. 41. 41Method 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. 42Method Handles§  Direct Method Handle указывает на Java метод.–  может эмулировать существующие инструкции§  Bound Method Handle хранит значение параметра–  связанный аргумент указывается при создании–  используется при каждом вызове–  любой MH может быть связан и это не видно вызывающему§  Adapter Method Handle преобразует значения «на лету»–  как аргументы, так и возвращаемое значение–  cast, box/unbox, collect/spread, filter, etc.–  любой MH может быть адаптирован и это не видно вызывающемуТипы
  43. 43. 43
  44. 44. 44Method Handles§  При создании method handle’а осуществляется и связывание сконкретным методом§  Может быть медленным–  делайте только один раз, если возможно§  Используйте CONSTANT_MethodHandle–  если генерируете байткодЖизненный цикл: Создание
  45. 45. 45Method Handles§  Осуществляется через методы, полиморфные относительно сигнатуры§  Сигнатура метода определяется в месте вызова (call site)§  Статически (в момент компиляции)§  Например, MethodHandle.invoke()–  (int)mh.invoke(1, 1L, new Object()) =>(int, long, Object)int§  Сигнатура должна точно соответствовать типу MethodHandle’а–  или нужно использовать invokeWithArgument§  Помечены @SignaturePolymorphic в кодеЖизненный цикл: Вызов
  46. 46. 46Method Handles§  «Точный» вызов (MH.invokeExact) прост–  условный переход–  немного дороже чем обычный виртуальный вызов.§  «Неточный» вызов (MH.invoke) может быть сложен–  если типы не совпадают–  иначе как invokeExact§  Вызов через invokedynamic инструкцию быстр–  всегда «точен» (call site всегда строго типизирован)–  код метода обычно инлайнитсяЖизненный цикл: Вызов
  47. 47. 47Method Handles§  Инструкция invokedynamic–  call site с оптимистично предсказанным вызовом метода–  предсказанный method handle предполагается константой§  “static final” MH переменные рассматриваются как константы§  Константные method handle’ы могут быть заинлайнены–  может позволить избавиться от адаптеров и связанных аргументов–  может продолжаться до прямых указателей на Java методыЖизненный цикл: Связывание
  48. 48. 48Method Handles§  MethodHandle–  прямой указатель + различные адаптации§  MethodType–  сигнатура метода§  MethodHandles.Lookup–  конструирование method handle’ов§  MethodHandles–  набор вспомогательный функций для получения и адаптации methodhandle’овПакет java.lang.invoke
  49. 49. 49Method HandlesПримеры использованияMethodHandles.Lookup LOOKUP = MethodHandles.lookup();
  50. 50. 50Method HandlesПримеры использованияMethodHandles.Lookup LOOKUP = MethodHandles.lookup();MethodHandle HASHCODE =LOOKUP. findStatic(System.class,"identityHashCode",MethodType.methodType(int.class, Object.class));
  51. 51. 51Method 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. 52Method HandlesПримеры использованияMethodHandles.Lookup LOOKUP = MethodHandles.lookup();MethodHandle CONCAT =LOOKUP. findVirtual(String.class,"concat",MethodType.methodType(String.class, String.class));
  53. 53. 53Method 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. 54Method 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. 55Сравнение с Reflection API§  Быстрее чем Reflection API–  проверки прав доступа при каждом вызове не нужны§  осуществляются при создании MH–  цепочки MH хорошо инлайнятся§  Удобнее чем Reflection API–  комбинаторная библиотека для трансформации MH–  точная типизация(по желанию)
  56. 56. 56Использование JSR292§  JRuby§  Project Lambda (Java 8)§  Nashorn (Java 8)Крупные проекты, активно использующие JSR292
  57. 57. 57Brian GoetzJava Language Architect,Oracle, April, 2012“… We can achieve both of these goals [maximizing flexibility & providingstability] by using the invokedynamic feature from JSR 292 to separate thebinary representation of lambda creation in the bytecode from the mechanicsof evaluating the lambda expression at runtime. The use of invokedynamic letsus defer the selection of a translation strategy until run time. ”Project Lambda (Java 8)
  58. 58. 58Brian GoetzJava Language Architect,Oracle, April, 2012“… We can achieve both of these goals [maximizing flexibility & providingstability] by using the invokedynamic feature from JSR 292 to separate thebinary representation of lambda creation in the bytecode from the mechanicsof evaluating the lambda expression at runtime. The use of invokedynamiclets us defer the selection of a translation strategy until run time. ”Project Lambda (Java 8)
  59. 59. 59“JDK8: Я, лямбда”Сергей Куксенко, Алексей Шипилев, Oracleсегодня, 16:45-17:45, зал «Moscow»“JDK8: Молот лямбд”Алексей Шипилев, Сергей Куксенко, Oracleсегодня, 18:00-19:00, зал «Moscow»Project Lambda (Java 8)
  60. 60. 60Итоги§  Роскошь? Далеко не всегда!§  Быстрее чем Reflection API§  Удобнее чем Reflection API
  61. 61. 61Использование§  invokedynamic доступна только на уровне байткода–  через библиотеку ASM, например§  … но method handle’ы можно использовать в обычном Java коде!
  62. 62. 62JIT-компилятор в JVMглазами Java программистаВладимир Иванов, Oracleзавтра, 10:45-11:45, зал «Moscow»
  63. 63. 63Вопросы?vladimir.x.ivanov@oracle.com@iwanowww
  64. 64. 64Graphic Section Divider
  65. 65. 65
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×