Поддержка java 8 в excelsior jet -...

83
Поддержка Java 8 в Excelsior JET Никита Липский Excelsior LLC 1

Upload: others

Post on 21-Aug-2020

31 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ПоддержкаJava8вExcelsiorJETНикитаЛипскийExcelsiorLLC

1

Page 2: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Ктознаетпросебя?•  Более20летпрофессиональнойкарьеры•  ИнициаторпроектаExcelsiorJET

–  работалнадпроектомболее16лет–  какидейныйвдохновитель–  компиляторныйинженер–  руководитель–  имноговкакихещеролях

•  OpensourceпроектыWebFXиJavaReStart–  всвободноеотработывремя

•  twi_er:@pjBooms

2

Page 3: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

КтознаетпроExcelsiorJET?•  ПолнаяреализацияJavaSE

–  c2005годаcертифицированакакJavaCompahble

•  AOTcompiler+JavaRunhme–  смешаннаякомпиляция:AOT+JIT–  поддержканестандартныхзагрузчиковклассоввAOTрежиме(для

EclipseRCP,Tomcat)

•  Toolkit–  StartupOphmizer–  Deployment

3

Page 4: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

КтознаетпроExcelsiorJET?

КтознаетпроExcelsiorJET?КтознаетпроExcelsiorJET?

4

Page 5: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ЧтодобавленовJava8•  Lambda-expressions•  DefaultMethods•  StreamAPI,TimeAPI•  Typeannotahons,Parameternames•  JavaFX8•  Nashorn•  CompactProfiles

5

Page 6: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Defaultmethods

6

Page 7: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

DefaultMethods•  Методыстеламивинтерфейсах– Мотивация:расширениеJavaAPI,неломаяобратнуюсовместимость

List<Person> list = ... list.forEach(System.out::println)

forEach нетвJava7

7

Page 8: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

DefaultMethodsПовлиялинаспецификациюJVM:•  Измениласьсемантикаинструкций:

–  Invokespecial–  invokevirtual–  invokeinterface–  invokestahc

•  Измениласьпроцедурастатическойинициализациикласса

8

Page 9: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Resolveметода•  Всеinvokeинструкции(кромеinvokedynamic)ссылаютсянавызываемыйметодcимвольно

•  Передтемкакinvokeинструкцияисполнится,должнапройтипроцедураразрешениясимвольнойссылкинаметод

9

Page 10: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ResolveметодаПустьестьссылкаC.foo():•  ИщемfooвC:•  Еслиненашли,ищемfooвсуперклассахC•  Еслиненашли,ищемfooвсуперинтерфейсахC•  NewinJava8:–  припоискеметодавсуперинтерфейсах,вначалеищетсямаксимальноспецифичныйdefaultметод

10

Page 11: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ResolveметодаМаксимальноспецифичныйdefaultметод:•  defaultметод,которыйнепереопределяетсявпотомкахданногоинтерфейса,которыеимплементируетсяклассомC

•  Еслиесть,тодолженбытьодин– ИначепроцедурарезолвабросаетIncompahbleClassChangeError

11

Page 12: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Resolveметодаinterface I { default void foo(){…}}

class A { void foo(){…}}

class C extends A implements I{}

C.foo() - ?

12

Page 13: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Resolveметодаinterface I { default void foo(){…}}

interface J extends I { default void foo(){…}}

class C implements J,I { }

C.foo() - ?

13

Page 14: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Resolveметодаinterface I { default void foo(){…}}

interface J { default void foo(){…}}

class C implements J,I { }

C.foo() - ?

14

Page 15: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

invokespecial•  Используетсядлявызоваконструкторовисуперметодов

•  Целевойметодвызовастатическивычислим–  можетвызыватьсянапрямую–  можетинлайнитьсясразуввызывающийметод

•  Вызываетметод(чащевсего),которыйвозвращаетсяпроцедуройresolveметода–  т.o.можетвызыватьdefaultметодывJava8

15

Page 16: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

invokespecial•  ПоддержкавAOTкомпиляторе:–  Resolveметодовпроисходитдоисполненияпрограммы(нопоJVMспецификации)

–  Каждыйметод,каждогокомпилируемогоклассакомпилируетсявмашинныйкодиимеетадрес

–  invokespecial<MethofRef>транслируетсяв:call<MethodAddress>

16

Page 17: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

invokevirtual•  Вызываемыйметодзависитотобъектаполучателя(this)

•  Транслируетсявкосвенныйвызовчерезтаблицувиртуальныхметодов

invokevirtual<MethofRef>->call[<VMTAddress>+MethodSlotInVMT*C]

17

Page 18: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

invokevirtual•  Схемапредставленияобъектавпамяти

18

Page 19: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

19

abstract class A implements I { { void meth1(){…} abstract void meth2();}interface I { void meth3();}

class C extends A { void meth2(){…} void meth3(){…} void meth4(){…} }

AbstractMethodError

Page 20: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

20

abstract class A implements I { { void meth1(){…} abstract void meth2();}interface I { void meth3();}

class C extends A { implements J { void meth2(){…}}interface J { default void meth3(){…} default void meth4(){…}}

AbstractMethodError

NewinJava8

Page 21: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ПоддержкаdefaultметодоввExcelsiorJET

•  Компиляцияметодовинтерфейсов•  Изменениепроцедурырезолваметодов•  ИзменениепроцедурызаполненияVMT

21

Page 22: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

НайденныебагиприподдержкиJava8вExcelsiorJET

•  ВJVMспецификации–  overrideметода

(h_ps://bugs.openjdk.java.net/browse/JDK-8098577)•  ВHotSpot

–  статическаяинициализацияклассоввприсутствииdefaultметодовинициализируетбольшеклассовчемнужно(h_ps://bugs.openjdk.java.net/browse/JDK-8098557)

–  вresolveметодов:“InterfaceMethodCPentrypoinhngtoaclassshouldcauseICCE”(h_ps://bugs.openjdk.java.net/browse/JDK-8087223)

22

Page 23: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Lambdaвыражения

23

Page 24: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ЛямбдавыраженияБыло

new Thread(new Runnable() { public void run() {

System.out.println(“Hi,I’m Thread”); }}).start();

24

Page 25: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ЛямбдавыраженияСтало…

new Thread(new Runnable() { public void run() {

System.out.println(“Hi,I’m Thread”); }}).start();

25

Page 26: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ЛямбдавыраженияСталоnew Thread(()->

System.out.println(“Hi,I’m Thread”)).start();

26

Page 27: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Лямбдавыражения

Каклямбда-выраженияповлиялинаспецификациюJVM?

27

Page 28: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Лямбдавыражения

Каклямбда-выраженияповлиялинаспецификациюJVM?Никак!

28

Page 29: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ТрансляциялямбдавыраженийвJavaбайткод

class B { public void foo() { List<Person> list = ... final int bottom = ..., top = ...; list.removeIf( p ->

(p.size >= bottom && p.size <= top) ); }}

29

Page 30: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ТрансляциялямбдавыраженийвJavaбайткод

class B { public void foo() { List<Person> list = ... final int bottom = ..., top = ...; list.removeIf(new Predicate() { public boolean apply(Person p) { (p.size >= bottom && p.size <= top); } ); }}

30

Page 31: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ТрансляциялямбдавыраженийвJavaбайткод

class B { public void foo() { List<Person> list = ... final int bottom = ..., top = ...; list.removeIf(new Predicate() { public boolean apply(Object o) { (p.size >= bottom && p.size <= top); } ); }}

31

Page 32: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ТрансляциялямбдавыраженийвJavaбайткод

class B { public void foo() { List<Person> list = ... final int bottom = ..., top = ...; list.removeIf(

[lambda for lambda$1 as Predicate capturing (bottom, top) ] }

static boolean lambda$1(int bottom, int top, Person p) { return p.size >= bottom && p.size <= top; }}

32

Page 33: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ТрансляциялямбдавыраженийвJavaбайткод

class B { public void foo() { List<Person> list = ... final int bottom = ..., top = ...; list.removeIf( indy((MH(metaFactory), //bootstrap MH(invokeVirtual Predicate.apply), MH(invokeStatic B.lambda$1))(bottom, top)) }

static boolean lambda$1(int bottom, int top, Person p) { return p.size >= bottom && p.size <= top; }}

33

Page 34: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Лямбда-выражения

АIndy–этофичаJava7!

34

Page 35: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

IndyIndy–сокращениеотinvokedynamic•  Впервыйразindyзоветbootstrapметод,

которыйвозвращаетобъектCallSite•  Далееиприпоследующихвызовахотобъекта

callsiteберетсяМethodHandleизоветсяinvokeExact

35

Page 36: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

MethodHandleMethodHandle–целевойобъектindy:•  можетбытьдоступомкполю,методу•  адаптеромдругихMethodHandle

–  адаптерыаргументов–  частичноеприменениеаргументов(binding)–  условныйпереход(guardWithTest)

Должныработатьбыстро–  ВсечтоможновыразитьчерезMethodHandle,можновыразить

черезReflechon,ноэтонеэффективно

36

Page 37: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

MethodHandleMethodHandlescJava7Update40реализованычерезlambda-forms:–  Внутреннеепредставлениеметодхэндлов– ПоэтомувнутреннемупредставлениюдинамическипорождаетсяJavaбайткод(Runhmeанонимныеклассы)

–  Реализациясостоитна90%изpureJavaкодаипереиспользуетсявExcelsiorJET

37

Page 38: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Runfmeанонимныеклассы•  Настолькоанонимные,чтоихдаженетвJVMспецификации– полнуюсемантикувозможновычислитьтолькоизисходныхтекстовHotSpot

38

Page 39: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Runfmeанонимныеклассы•  ИзJavaсоздаютсячерез

Unsafe.defineAnonymousClass

•  Непринадлежаткакому-либокласслоадеру,ихнельзянайти,нетreflechon

•  ВJava8ихсемантикапоменялась–  онимогутдоступатьсядоprivateчленовклассовихпородивших(дотеллямбд)

39

Page 40: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ВернемсяклямбдамЗадача:ПустьестьJavaкодRunnable r = ()->System.out.println(“Hi”);r.run();Требуется:вместоэтогокодапородить:System.out.println(“Hi”);

40

Page 41: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

РешениеHotSpot•  Исполняемкодметода,покаоннестанетгорячим–  порождаяизагружаяанонимныйкласс-заверткудлялямбдавыражения

•  Инлайнимвкодцелевогометодасначалакодединственногометодаанонимногокласса,азатемисамотелолямбды

•  АнонимныйкласссобираемGC

41

Page 42: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

РешениеJET*•  Восстанавливаемизбайткодавстатическом

компиляторелямбда-выражениевисходномвиде

•  Вычисляем,чтоединственноеиспользованиелямбды–этоеенепосредственныйвызов

•  Инлайнимтелолямбдавыражения*Поканереализовано

42

Page 43: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

РешениеJET*Аеслинамнеудалосьзаинлайнитьметодкудапередаетсялямбда-выражение?

43

Page 44: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

РешениеJET*

44

(p -> (p.size >= bottom && p.size <= top))

lambda$1:кодтелалямбды

захваченныйконтекст

Page 45: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

РешениеJET*

45

(p -> (p.size >= bottom && p.size <= top))

j.l.Objectmethods

привызовеgetClass(),создаетсяклассналету

lambda$1:кодтелалямбды

захваченныйконтекст

Ненужносоздаватьклассдлябольшинстваслучаев

Page 46: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ЛямбдывJET:текущийстатус•  покаработаютчерезindy,нотелалямбдстатическикомпилируются

•  динамическаякомпиляцияклассов-завертокдлялямбдоченьбыстрая(<1ms)

•  настандартныхбенчмарках,иреальныхприложенияхпоканебылозамеченоуменьшенияпроизводительностииз-залямбд

46

Page 47: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Типовыеаннотации

47

Page 48: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ТиповыеаннотацииМогутбытьвездегдеестьтип:

class TypeAnnotationsExample { @Encrypted String data; List<@NonNull String> strings; HashSet names = (@Immutable HashSet) set;

}

48

Page 49: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Типовыеаннотации•  КодируютсявJavaбайткодеатрибутомтипаRunhme(In)VisibleTypeAnnotahon–новыеатрибутыJava8байткода

•  ДоступныврантаймчерезReflechonAPI:–  getTypeAnnotahons

КакпредставляютсявExcelsiorJET?

49

Page 50: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ReflecfonвHotSpot•  HotSpotJVMхранитвMetaSpaceрантаймпредставлениеJavaкласс-файла

•  Вкласс-файлеестьвсянужнаяинформациядляreflechon

•  РеализацияReflechonAPIвHotSpotработаетнепосредственноскласс-файлами

50

Page 51: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ReflecfonвExcelsiorJET•  Послестатическойкомпиляцииотклассовнеостаетсякласс-файлов–  ПослерезолвассылоквAOTкомпилятореитрансляциибайткодавмашинныйкод,большаячастькласс-файластановитсяненужнавсвоемпервоначальномвиде.

•  Мета-информацияоклассахпишетсявисполняемыйфайлвсекциюданных

•  Пишетсятолькото,чтонеобходимоReflechon–  именаполей,методов,аннотации

51

Page 52: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ReflecfonвExcelsiorJET•  АннотациипишутсявформатеоченьпохожемнаформатаннотацийвJavaбайткоде– можнопереиспользоватьJavaкод,которыйихразбирает

ДляJava8AOTкомпиляторпришлосьнаучитьсохранятьтиповыеаннотации

52

Page 53: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Именапараметров•  Еслиjavac задатьключ–parameters,то–  вкласс-файлбудутписатьсяименапараметров–  именапараметровбудутдоступнычерезreflechon

КакпредставляютсявExcelsiorJET?

Легко!53

Page 54: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

NewJava8APIs

54

Page 55: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

NewJava8APIs•  StreamAPI•  TimeAPI•  JavaFX8•  Nashorn

КакподдерживаютсявJET?ТакжекакивсеостальныеJavaAPI!

55

Page 56: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

NewJava8APIs•  StreamAPI•  TimeAPI•  JavaFX8•  Nashorn

КакподдерживаютсявJET?ТакжекакивсеостальныеJavaAPI!

56

Page 57: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

NewJava8APIs•  Excelsior–официальныйJavaSElicensee–  лицензируемвсеисходныетекстыJavaSEуOracle– можемпоступатьснимикакхотим,напримеркомпилироватьJavaбайт-кодплатформывмашинныйкодииспользоватьсвоюреализациюJVM

–  обязаныпроходитьтестынасовместимость(JCK)

57

Page 58: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

NewJava8APIsНевсеJava8APIsодинаковостандартны:•  StreamAPI,TimeAPIвходятвстандарт

Java8

•  Nashorn,JavaFXНЕвходятвстандартJavaSE–  вчастностинеттестовJCK

58

Page 59: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

СтруктураOracleJRE

59

Page 60: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

СтруктураOracleJRE•  КлассыNashornиJavaFXнаходятсявпапкеext–  грузятсяExtensionкласслоадером

•  ВсечтонаходитсявпапкеextможноофициальноневключатьвPrivateJREдистрибутивасвоегоприложения

60

Page 61: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

РаспространениеприложенийскомпилированныхExcelsiorJET

•  СкомпилированныеспомощьюExcelsiorJETприложениявсегдараспространяютсясприватнойкопиейJETRunhme:– вашипользователинедолжныставить“ExcelsiorJRE”

61

Page 62: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

РаспространениеприложенийскомпилированныхExcelsiorJET

•  СтруктураJETRunhmeнадискеоченьпохожанаOracleJRE:– ресурсы(шрифты,картинки)ибиблиотекисnahveметодаминаходятсянатехжеместах

– классыизrt.jarидругих.jarкомпилируютсявнаборDLL

62

Page 63: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

JetPackII

Подготавливаетвашеприложениедлядальнейшегораспространения

63

Page 64: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

JetPackII•  JET-скомпилированныеисполняемыефайлысвязываютсясприватнойкопиейJETRunhme

•  ПозволяетвыбиратьнужныечастиJETRunhmeдлявашегоприложения

•  NewinJava8:позволяетНЕвключатьJavaFXиNashorn,еслионинеиспользуютсявашимприложением

64

Page 65: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

CompactProfiles

65

Page 66: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

CompactProfiles Compact1 Compact2 Compact3

java.lang java.rmi java.lang.instrument

java.io java.sql java.lang.management

java.math javax.transachon javax.management

java.nio javax.xml javax.naming

java.uhl org.w3c.dom javax.script

java.net org.xml.sax javax.security

java.security javax.sql

javax.crypto javax.xml.crypto

java.text org.ie¥.jgss

66

Page 67: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

CompactProfiles•  ЕстьвJavaSEEmbedded(Linuxbuilds)•  ВOpenJDK(несобираютсянаWindowsиMacOSX)

67

Page 68: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ИсториякомпонентизацииJavaSEотExcelsior

•  РазбиениеJavaSEнаAPIs(2000год)–  компиляцияихвDLL

•  JetPerfect(2001год)–  компиляцияприложенийснужнымичастямиJavaSEводинEXEфайл

–  SWTExample:1.4MB•  JavaRunhmeSlim-Down(2007год)

–  совместимоесJavaSEспецификациейрешение•  CompactProfiles(2016год)

68

Page 69: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

ИсториякомпонентизацииJavaSEотSun/Oracle

•  KernelJRE(2006год)

•  ProjectJigsaw2007–2017(?)

•  CompactProfiles(2014год)

69

Page 70: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

CompactProfiles•  ПервыйрабочийилегальныйспособуменьшенияPrivateJRE

•  ЕстьJCK(тестысовместимости)

70

Page 71: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

CompactProfiles•  ПервыйрабочийилегальныйспособуменьшенияPrivateJRE

•  ЕстьJCK(тестысовместимости)

•  ЕстьвExcelsiorJETдлявсехдесктопныхплатформ(Windows,Linux,MacOSX)

71

Page 72: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

CompactProfiles•  ПоддержкавExcelsiorJET:– ПереразбивкаJETRTDLLsпограницамCompactProfiles

– ПоддержкавJetPackII:паковкаприложенияскомпактнымпрофилем,накоторомможетбытьзапущеноприложение

– ПроходитJCKдлясоответствующихкомпактныхпрофилей

72

Page 73: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

JavaFXonCompactProfiles

73

Page 74: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

JavaFX8onCompactProfiles•  JavaFXусловносостоитизтрехлогическихчастей:– CoreJavaFX–  JavaFXWeb(WebKitbased)–  JavaFXbridgestoSwingиSWT

74

Page 75: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

JavaFX8onCompactProfiles•  CoreJavaFXможетработатьнаCompact2– FXMLзависитотXML

•  JavaFXSwingBridgeтребуетFullJavaSE–  ТаккакочевиднозависитотSwing

75

Page 76: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

JavaFX8onCompactProfiles•  JavaFXWebтожеимеетзависимостиотAWT…

76

Page 77: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

JavaFX8onCompactProfiles•  JavaFXWebтожеимеетзависимостиотAWT,которыенеразрешаютсявовремяисполненияJ!

77

Page 78: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

JavaFX8onCompactProfiles•  JavaFXWebтожеимеетзависимостиотAWT,которыенеразрешаютсявовремяисполнения,кромеоднойL…

78

Page 79: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

JavaFX8onCompactProfiles•  JavaFXWebтожеимеетзависимостиотAWT,которыенеразрешаютсявовремяисполнения,кромеодной,котораятоженеразрешаетсяврежиме-Xverify:none

79

Page 80: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

JavaFX8onCompactProfilesПоддержкаJavaFXWebвExcelsiorJET:•  зависимостиотAWTоткладываютсядоразрешениявовремяисполнения–  неразрешаютсявстатическомкомпиляторе

•  ВсеклассыJavaFXверифицируютсядоисполнения–  нетребуетсяверификациявовремяисполненияизагрузка“лишних”классов

•  ВрезультатеJavaFXWebработаетнаCompact2!

80

Page 81: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

JavaPackager(OracleJDK)vs.JetPackII(ExcelsiorJET)

JavaPackager

JetPackIIwithCompactProfiles

EnsembleDemo

(withWebViewsample)

46MB 21MB

BrickBreaker 42MB 10MB

81

Примечание:замерыпроизводилисьнаWindows32-bitдляJava8Update72,представленыразмерыдистрибутивовбеззависимостей

Page 82: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Заключение•  Java8–лучшийрелизJavaсовременJava5–  лямбдыповышаютпроизводительностьтруда

•  ЛямбдынеповлиялинаспецификациюJVM–  ножелательнаспециальнаяподдержкавJVM

•  CompactProfilesуменьшаютразмерPrivateJRE–  важнодлямагазиновприложенийивembedded

•  Java!=HotSpot82

Page 83: Поддержка Java 8 в Excelsior JET - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_4/Java8InJETv6.pdf · • Поддержка в Excelsior JET: – Переразбивка

Вопросыиответы

НикитаЛипский,Excelsior

[email protected]_er:@pjBooms

83