What to expect from Java 9
Transcript of What to expect from Java 9
Чего ждать от Java 9?
Иван Крылов
1
Зачем этот доклад?
2
Зачем этот доклад?
• До выхода JDK9 меньше года
• Знать об изменениях лучше заранее
2
Зачем этот доклад?
• До выхода JDK9 меньше года
• Знать об изменениях лучше заранее
• Я работаю в Azul Systems - производителе JDK
• Я - сторонний заинтересованный наблюдатель развития платформы
• Вся информация из публичных источников
2
Переход на новую версию Java
3
Переход на новую версию Java
New features!Новые возможности!3
Переход на новую версию Java
New features!Новые возможности! New incompatibilities!Источник ошибок и несовместимостей3
Переход на новую версию Java
Изображения - Ihttps://vijaybelola.wordpress.com/2011/09/20/let-the-games-begin/ ; https://ru.wikipedia.org/wiki/FacepalmNew features!Новые возможности! New incompatibilities!Источник ошибок и несовместимостей
3
Временные интервалы выхода версий Java
4
Временные интервалы выхода версий Java
JDK 6Дек 2006
JDK 7Июль 2011
JDK 8Мар 2014
JDK 9план. Сент 2016
4
GA
Временные интервалы выхода версий Java
JDK 6Дек 2006
JDK 7Июль 2011
JDK 8Мар 2014
JDK 9план. Сент 2016
JDK 6Ноя 2012
JDK 7Апр 2015
JDK 8план. Сент 2017
J2SE 1.4 Дек 2006
JDK 5Окт 2009
4
GA
EOL
Что означает наступление дня EOL?
5
Что означает наступление дня EOL?
Настал день EOLНужны исправления
найденных уязвимостей
&
5
Что означает наступление дня EOL?
Настал день EOLНужны исправления
найденных уязвимостей
&
5
Что означает наступление дня EOL?
Настал день EOLНужны исправления
найденных уязвимостей
&
Подписать Support Contract c
Oracle
5
Что означает наступление дня EOL?
Настал день EOLНужны исправления
найденных уязвимостей
&
Подписать Support Contract c
Oracle
Перейти на OpenJDK (Zulu, IcedTea, сборку своими силами)
5
Что означает наступление дня EOL?
Настал день EOLНужны исправления
найденных уязвимостей
&
Подписать Support Contract c
Oracle
Перейти на OpenJDK (Zulu, IcedTea, сборку своими силами)
Обновиться до следующей версии JDK
5
Вспомним новое в Java 8
6
Вспомним новое в Java 8• Лямбды
• Method references
• Type аннотации
• Повторяющиеся аннотации • Интерфейсные методы
6
Вспомним новое в Java 8• Лямбды
• Method references
• Type аннотации
• Повторяющиеся аннотации • Интерфейсные методы
6
• Stream API
• Date Time API• Замена PermGen• Nashorn, JavaScript Engine• Новые утилиты (jdeps,jjs,..)
От идей до нового функционала Java
7
От идей до нового функционала Java
JEP предложен
7
От идей до нового функционала Java
JEP предложен
JEP принят, найден “спонсор”
7
От идей до нового функционала Java
JEP предложен
JEP принят, найден “спонсор”
JEP подтвержден для Java версии N
7
От идей до нового функционала Java
JEP предложен
JEP принят, найден “спонсор”
JEP подтвержден для Java версии N
JEP реализован7
Путь JSR
Source: https://groups.google.com/forum/#!topic/java-social/InafCPMLLaA8
Путь JSR
Source: https://groups.google.com/forum/#!topic/java-social/InafCPMLLaA8
Ориентировочное расписание выхода Java 9
9
Ориентировочное расписание выхода Java 9Fe
atur
e co
mpl
ete
Zero
Bug
Bou
nce
Ram
pdow
n ph
ase
2Fin
al Re
lease
Can
dida
te
Дек’1
5
All te
sts ru
nRa
mpd
own
Star
t
Gene
ral A
vaila
bility
Фев ’
16
Фев ’
16
Апр
’16
Июнь
’16
Июль
’16
Сент
’16
9
Ориентировочное расписание выхода Java 9Fe
atur
e co
mpl
ete
Zero
Bug
Bou
nce
Ram
pdow
n ph
ase
2Fin
al Re
lease
Can
dida
te
Дек’1
5
All te
sts ru
nRa
mpd
own
Star
t
Gene
ral A
vaila
bility
Фев ’
16
Фев ’
16
Апр
’16
Июнь
’16
Июль
’16
Сент
’16
9
Модули
10
10
Инкапсуляция кода
11
Поля & Методы
Инкапсуляция кода
11
Классы
Поля & Методы
Инкапсуляция кода
11
Классы
Поля & Методы
Интерфейсы
…
Абстрактные Классы
…
Инкапсуляция кода
11
Пакеты
Классы
Поля & Методы
Интерфейсы
…
Абстрактные Классы
…
Инкапсуляция кода
11
Модули
Пакеты
Классы
Поля & Методы
Интерфейсы
…
Абстрактные Классы
…
Инкапсуляция кода
11
Проблемы существующей модели
12
Проблемы существующей модели• Java Runtime большой и “тяжелый” и будет дальше расти
12
Проблемы существующей модели• Java Runtime большой и “тяжелый” и будет дальше расти
• Профайлы 1, 2, 3 лишь частично решают проблему
12
Проблемы существующей модели• Java Runtime большой и “тяжелый” и будет дальше расти
• Профайлы 1, 2, 3 лишь частично решают проблему
• Jar / Classpath Hell
12
Проблемы существующей модели• Java Runtime большой и “тяжелый” и будет дальше расти
• Профайлы 1, 2, 3 лишь частично решают проблему
• Jar / Classpath Hell
• Что от чего зависит?..
12
Проблемы существующей модели• Java Runtime большой и “тяжелый” и будет дальше расти
• Профайлы 1, 2, 3 лишь частично решают проблему
• Jar / Classpath Hell
• Что от чего зависит?..
• Опциональные и транзитивные зависимости
12
Проблемы существующей модели• Java Runtime большой и “тяжелый” и будет дальше расти
• Профайлы 1, 2, 3 лишь частично решают проблему
• Jar / Classpath Hell
• Что от чего зависит?..
• Опциональные и транзитивные зависимости
• Ленивая загрузка и инициализация классов -> NoClassDefFoundError
12
Проблемы существующей модели• Java Runtime большой и “тяжелый” и будет дальше расти
• Профайлы 1, 2, 3 лишь частично решают проблему
• Jar / Classpath Hell
• Что от чего зависит?..
• Опциональные и транзитивные зависимости
• Ленивая загрузка и инициализация классов -> NoClassDefFoundError
• Примитивный механизм видимости для кода вне пакетов - только public
12
Проблемы существующей модели• Java Runtime большой и “тяжелый” и будет дальше расти
• Профайлы 1, 2, 3 лишь частично решают проблему
• Jar / Classpath Hell
• Что от чего зависит?..
• Опциональные и транзитивные зависимости
• Ленивая загрузка и инициализация классов -> NoClassDefFoundError
• Примитивный механизм видимости для кода вне пакетов - только public
• Классы из разных загрузчиков классов “видят” друг друга
12
Проблемы существующей модели• Java Runtime большой и “тяжелый” и будет дальше расти
• Профайлы 1, 2, 3 лишь частично решают проблему
• Jar / Classpath Hell
• Что от чего зависит?..
• Опциональные и транзитивные зависимости
• Ленивая загрузка и инициализация классов -> NoClassDefFoundError
• Примитивный механизм видимости для кода вне пакетов - только public
• Классы из разных загрузчиков классов “видят” друг друга
• SecurityManager помогает, но об этом надо знать12
Jigsaw
13
Jigsaw
Модули в Java
13
Jigsaw
Модулярность JDKМодули в Java
13
Jigsaw
JSR 376: Java Platform Module SystemJEP 261: Module System
Модулярность JDKМодули в Java
13
Jigsaw
JEP 162: Prepare for ModularizationJEP 200: The Modular JDKJEP 220: Modular Run-Time ImagesJEP 201: Modular Source CodeJEP 260: Encapsulate Most Internal APIs
JSR 376: Java Platform Module SystemJEP 261: Module System
Модулярность JDKМодули в Java
13
Пример 1
14
Пример 1Модуль S Модуль P
14
Пример 1src/s/module-info.java
module s { exports com.azul.services; }
src/p/module-info.java
module p { requires s; }
Модуль S Модуль P
14
Пример 1src/s/module-info.java
module s { exports com.azul.services; }
src/p/module-info.java
module p { requires s; }
Модуль S Модуль P
14
Пример 1src/s/module-info.java
module s { exports com.azul.services; }
src/p/module-info.java
module p { requires s; }
src/s/com/azul/services/LocProvider.java
package com.azul.services; import java.lang.String;
public class LocProvider { public static String getLocation() { return "Joker 2015"; } }
src/p/com/azul/presentations/ModulesDemo.java
package com.azul.presentations; import com.azul.services.LocProvider;
public class ModulesDemo { public static void main(java.lang.String[] argv) { System.out.println("I am at "+LocProvider.getLocation()); } }
Модуль S Модуль P
14
Новые параметры javac/java (1)
15
Новые параметры javac/java (1)• # Компиляция
• $cd/src
• $J/javac -modulesourcepath . -mp s -d target s/module-info.java s/com/azul/services/LocProvider.java
• $J/javac -modulesourcepath . -mp p -d target p/module-info.java p/com/azul/presentations/ModulesDemo.java
• # Запуск
• $J/java -mp target -m p/com.azul.presentations.ModulesDemo
15
Новые параметры javac/java (2)
16
Новые параметры javac/java (2)
16
• # Упаковка
• $J/jar --create --file ./jars/p.jar -e com.azul.presentations/ModulesDemo -C target/p .
• # Запуск
• $j/bin/java -mp jars -m p
Пример 2
17
Пример 2./nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java
module jdk.scripting.nashorn { requires java.logging; requires public java.scripting;
uses jdk.internal.dynalink.linker.GuardingDynamicLinker; uses jdk.nashorn.internal.runtime.CodeStore; provides javax.script.ScriptEngineFactory with jdk.nashorn.api.scripting.NashornScriptEngineFactory;
exports jdk.nashorn.api.scripting; exports jdk.nashorn.api.tree;
exports jdk.nashorn.internal.runtime to jdk.scripting.nashorn.shell; exports jdk.nashorn.internal.objects to jdk.scripting.nashorn.shell; exports jdk.nashorn.tools to jdk.scripting.nashorn.shell; }
17
Пример 2./nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java
module jdk.scripting.nashorn { requires java.logging; requires public java.scripting;
uses jdk.internal.dynalink.linker.GuardingDynamicLinker; uses jdk.nashorn.internal.runtime.CodeStore; provides javax.script.ScriptEngineFactory with jdk.nashorn.api.scripting.NashornScriptEngineFactory;
exports jdk.nashorn.api.scripting; exports jdk.nashorn.api.tree;
exports jdk.nashorn.internal.runtime to jdk.scripting.nashorn.shell; exports jdk.nashorn.internal.objects to jdk.scripting.nashorn.shell; exports jdk.nashorn.tools to jdk.scripting.nashorn.shell; }
17
Пример 2./nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java
module jdk.scripting.nashorn { requires java.logging; requires public java.scripting;
uses jdk.internal.dynalink.linker.GuardingDynamicLinker; uses jdk.nashorn.internal.runtime.CodeStore; provides javax.script.ScriptEngineFactory with jdk.nashorn.api.scripting.NashornScriptEngineFactory;
exports jdk.nashorn.api.scripting; exports jdk.nashorn.api.tree;
exports jdk.nashorn.internal.runtime to jdk.scripting.nashorn.shell; exports jdk.nashorn.internal.objects to jdk.scripting.nashorn.shell; exports jdk.nashorn.tools to jdk.scripting.nashorn.shell; }
17
Пример 2./nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java
module jdk.scripting.nashorn { requires java.logging; requires public java.scripting;
uses jdk.internal.dynalink.linker.GuardingDynamicLinker; uses jdk.nashorn.internal.runtime.CodeStore; provides javax.script.ScriptEngineFactory with jdk.nashorn.api.scripting.NashornScriptEngineFactory;
exports jdk.nashorn.api.scripting; exports jdk.nashorn.api.tree;
exports jdk.nashorn.internal.runtime to jdk.scripting.nashorn.shell; exports jdk.nashorn.internal.objects to jdk.scripting.nashorn.shell; exports jdk.nashorn.tools to jdk.scripting.nashorn.shell; }
17
Пример 2./nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java
module jdk.scripting.nashorn { requires java.logging; requires public java.scripting;
uses jdk.internal.dynalink.linker.GuardingDynamicLinker; uses jdk.nashorn.internal.runtime.CodeStore; provides javax.script.ScriptEngineFactory with jdk.nashorn.api.scripting.NashornScriptEngineFactory;
exports jdk.nashorn.api.scripting; exports jdk.nashorn.api.tree;
exports jdk.nashorn.internal.runtime to jdk.scripting.nashorn.shell; exports jdk.nashorn.internal.objects to jdk.scripting.nashorn.shell; exports jdk.nashorn.tools to jdk.scripting.nashorn.shell; }
17
Пример 2./nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java
module jdk.scripting.nashorn { requires java.logging; requires public java.scripting;
uses jdk.internal.dynalink.linker.GuardingDynamicLinker; uses jdk.nashorn.internal.runtime.CodeStore; provides javax.script.ScriptEngineFactory with jdk.nashorn.api.scripting.NashornScriptEngineFactory;
exports jdk.nashorn.api.scripting; exports jdk.nashorn.api.tree;
exports jdk.nashorn.internal.runtime to jdk.scripting.nashorn.shell; exports jdk.nashorn.internal.objects to jdk.scripting.nashorn.shell; exports jdk.nashorn.tools to jdk.scripting.nashorn.shell; }
17
Пример 2./nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java
module jdk.scripting.nashorn { requires java.logging; requires public java.scripting;
uses jdk.internal.dynalink.linker.GuardingDynamicLinker; uses jdk.nashorn.internal.runtime.CodeStore; provides javax.script.ScriptEngineFactory with jdk.nashorn.api.scripting.NashornScriptEngineFactory;
exports jdk.nashorn.api.scripting; exports jdk.nashorn.api.tree;
exports jdk.nashorn.internal.runtime to jdk.scripting.nashorn.shell; exports jdk.nashorn.internal.objects to jdk.scripting.nashorn.shell; exports jdk.nashorn.tools to jdk.scripting.nashorn.shell; }
17
Пример 2./nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java
module jdk.scripting.nashorn { requires java.logging; requires public java.scripting;
uses jdk.internal.dynalink.linker.GuardingDynamicLinker; uses jdk.nashorn.internal.runtime.CodeStore; provides javax.script.ScriptEngineFactory with jdk.nashorn.api.scripting.NashornScriptEngineFactory;
exports jdk.nashorn.api.scripting; exports jdk.nashorn.api.tree;
exports jdk.nashorn.internal.runtime to jdk.scripting.nashorn.shell; exports jdk.nashorn.internal.objects to jdk.scripting.nashorn.shell; exports jdk.nashorn.tools to jdk.scripting.nashorn.shell; }
META-INF/services
17
Cосуществование cp и mp
18
Cосуществование cp и mp• Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль
18
Cосуществование cp и mp• Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль
• Безымянные модули видят все именованные модули (requires *)
18
Cосуществование cp и mp• Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль
• Безымянные модули видят все именованные модули (requires *)
• Обратное - неверное, надо указать requires unnamed или …
18
Cосуществование cp и mp• Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль
• Безымянные модули видят все именованные модули (requires *)
• Обратное - неверное, надо указать requires unnamed или …
• jar файл, который попал в mp автоматически превращается в модуль с названием, совпадающим с названием jar-файла
18
Cосуществование cp и mp• Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль
• Безымянные модули видят все именованные модули (requires *)
• Обратное - неверное, надо указать requires unnamed или …
• jar файл, который попал в mp автоматически превращается в модуль с названием, совпадающим с названием jar-файла
• автомодули становятся мостом для видимости именными модулями классов в безымянным модуле
18
Cосуществование cp и mp• Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль
• Безымянные модули видят все именованные модули (requires *)
• Обратное - неверное, надо указать requires unnamed или …
• jar файл, который попал в mp автоматически превращается в модуль с названием, совпадающим с названием jar-файла
• автомодули становятся мостом для видимости именными модулями классов в безымянным модуле
• Типы ищутся безымянном модуле в последнюю очередь 18
19
jdeps -genmoduleinfo
cat /Users/ivan/test/modules/generated/glassfish.corba.omgapi/module-info.java module glassfish.corba.omgapi { requires public java.corba; requires public java.desktop; requires public java.rmi; exports com.sun.corba.ee.org.omg.CORBA; exports javax.rmi.CORBA; exports org.omg.CORBA; exports org.omg.CORBA.DynAnyPackage; exports org.omg.CORBA.ORBPackage; exports org.omg.CORBA.TSIdentificationPackage; exports org.omg.CORBA.TypeCodePackage; exports org.omg.CORBA.portable; exports org.omg.CORBA_2_3; exports org.omg.CORBA_2_3.portable; exports org.omg.CosNaming; exports org.omg.CosNaming.NamingContextExtPackage; exports org.omg.CosNaming.NamingContextPackage; exports org.omg.CosTSInteroperation; exports org.omg.CosTSPortability; exports org.omg.CosTransactions; exports org.omg.Dynamic; exports org.omg.DynamicAny; exports org.omg.DynamicAny.DynAnyFactoryPackage; exports org.omg.DynamicAny.DynAnyPackage; exports org.omg.IOP; exports org.omg.IOP.CodecFactoryPackage; exports org.omg.IOP.CodecPackage; exports org.omg.Messaging; exports org.omg.PortableInterceptor; exports org.omg.PortableInterceptor.ORBInitInfoPackage; exports org.omg.PortableServer; exports org.omg.PortableServer.CurrentPackage; exports org.omg.PortableServer.POAManagerPackage; exports org.omg.PortableServer.POAPackage; exports org.omg.SendingContext; exports org.omg.stub.java.rmi; }
jdeps
-genmoduleinfo ~/test/modules/generated/
glassfish-4.1.1/glassfish/modules/glassfish-corba-omgapi.jar
20
jdeps -jdkinternalsglassfish-corba-orb.jar -> java.corba com.sun.corba.ee.impl.copyobject.OldReflectObjectCopierImpl (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.copyobject.OldReflectObjectCopierImpl$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.encoding.BufferManagerWriteStream (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.IIOPInputStream (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.IIOPInputStream$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.IIOPOutputStream (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.IIOPOutputStream$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.ObjectStreamClass (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.ObjectStreamClass$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.ObjectStreamField (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.ObjectStreamField$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl$1 (glassfish-corba-orb.jar) -> com.sun.jndi.cosnaming.CNCtx JDK internal API (java.corba) com.sun.corba.ee.impl.util.JDKClassLoader (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.util.JDKClassLoader$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba)
jdeps
-jdkinternals
glassfish/ modules/ glassfish-corba-orb.jar
21
java -XaddExports
java -XaddExports :java.base/sun.security.provider=ALL-UNNAMED, java.base/sun.security.pkcs=ALL-UNNAMED, java.base/sun.security.util=ALL-UNNAMED, java.base/sun.security.x509=ALL-UNNAMED, :
Модулярность
Source: http://openjdk.java.net/projects/jigsaw/doc/jdk-modularization.html22
Модулярность
Source: http://openjdk.java.net/projects/jigsaw/doc/jdk-modularization.html
JDK 7 b65
22
Модулярность
Source: http://openjdk.java.net/projects/jigsaw/doc/jdk-modularization.html
JDK 8 b48
22
Модулярность
Source: http://openjdk.java.net/projects/jigsaw/doc/jdk-modularization.html
JDK9 EA
22
О чем я не расскажу сегодня
23
О чем я не расскажу сегодня
23
• Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн
О чем я не расскажу сегодня
23
• Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн
• Модуляризованный jar; multirelease jar
О чем я не расскажу сегодня
23
• Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн
• Модуляризованный jar; multirelease jar
• Пакеты с одинаковыми названиями и внезапные NoClassDefFoundException
О чем я не расскажу сегодня
23
• Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн
• Модуляризованный jar; multirelease jar
• Пакеты с одинаковыми названиями и внезапные NoClassDefFoundException
• Layers - новая абстракция над classloaders
О чем я не расскажу сегодня
23
• Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн
• Модуляризованный jar; multirelease jar
• Пакеты с одинаковыми названиями и внезапные NoClassDefFoundException
• Layers - новая абстракция над classloaders
• Инструментарий для модуляризации кода
• <java9_jigsaw>/bin/jdeps -help
• IDE скоро помогут
О чем я не расскажу сегодня
23
• Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн
• Модуляризованный jar; multirelease jar
• Пакеты с одинаковыми названиями и внезапные NoClassDefFoundException
• Layers - новая абстракция над classloaders
• Инструментарий для модуляризации кода
• <java9_jigsaw>/bin/jdeps -help
• IDE скоро помогут
• Циркулярные зависимости между модулями через загрузчики модулей и как их избежать
(Мои) Выводы про модули в Java 9
24
(Мои) Выводы про модули в Java 9• Цель - явное обязательное указание зависимостей
24
(Мои) Выводы про модули в Java 9• Цель - явное обязательное указание зависимостей
• Пересечение с OSGi незначительное
24
(Мои) Выводы про модули в Java 9• Цель - явное обязательное указание зависимостей
• Пересечение с OSGi незначительное
• Предоставляет новые возможности по оптимизации
24
(Мои) Выводы про модули в Java 9• Цель - явное обязательное указание зависимостей
• Пересечение с OSGi незначительное
• Предоставляет новые возможности по оптимизации
• Сохранена совместимость с jar/cp (именные м., безымянный м., автомодули)
24
(Мои) Выводы про модули в Java 9• Цель - явное обязательное указание зависимостей
• Пересечение с OSGi незначительное
• Предоставляет новые возможности по оптимизации
• Сохранена совместимость с jar/cp (именные м., безымянный м., автомодули)
• jigsaw теряет функциональность на пути к финалу
• поддержка версий была еще весной 2015, осталась лишь декларация
24
(Мои) Выводы про модули в Java 9• Цель - явное обязательное указание зависимостей
• Пересечение с OSGi незначительное
• Предоставляет новые возможности по оптимизации
• Сохранена совместимость с jar/cp (именные м., безымянный м., автомодули)
• jigsaw теряет функциональность на пути к финалу
• поддержка версий была еще весной 2015, осталась лишь декларация
• IDEs учатся работать с модулями24
Jigsaw - статус, ссылки
25
Jigsaw - статус, ссылки• Работа продолжается
25
Jigsaw - статус, ссылки• Работа продолжается
• Статья о текущем состоянии (Сентябрь 2015)
• http://openjdk.java.net/projects/jigsaw/spec/sotms/
25
Jigsaw - статус, ссылки• Работа продолжается
• Статья о текущем состоянии (Сентябрь 2015)
• http://openjdk.java.net/projects/jigsaw/spec/sotms/
• Доклады с JavaOne (октябрь 2015)
• http://openjdk.java.net/projects/jigsaw/j1/
25
Jigsaw - статус, ссылки• Работа продолжается
• Статья о текущем состоянии (Сентябрь 2015)
• http://openjdk.java.net/projects/jigsaw/spec/sotms/
• Доклады с JavaOne (октябрь 2015)
• http://openjdk.java.net/projects/jigsaw/j1/
• Код не залит в основной репозиторий, а находится в репозитории Jake
• http://hg.openjdk.java.net/jigsaw/jake/
25
Jigsaw - статус, ссылки• Работа продолжается
• Статья о текущем состоянии (Сентябрь 2015)
• http://openjdk.java.net/projects/jigsaw/spec/sotms/
• Доклады с JavaOne (октябрь 2015)
• http://openjdk.java.net/projects/jigsaw/j1/
• Код не залит в основной репозиторий, а находится в репозитории Jake
• http://hg.openjdk.java.net/jigsaw/jake/
• А также: http://blog.codefx.org/java/dev/features-project-jigsaw-java-9/25
JShell
26
JShell• Развивается в рамках проекта Kulla
• http://openjdk.java.net/projects/kulla/
26
JShell• Развивается в рамках проекта Kulla
• http://openjdk.java.net/projects/kulla/
• Интегрирован в openjdk9/dev b90
26
JShell• Развивается в рамках проекта Kulla
• http://openjdk.java.net/projects/kulla/
• Интегрирован в openjdk9/dev b90
• Позволяет попробовать синтаксис без написания законченной программы
26
JShell• Развивается в рамках проекта Kulla
• http://openjdk.java.net/projects/kulla/
• Интегрирован в openjdk9/dev b90
• Позволяет попробовать синтаксис без написания законченной программы
• Помогает обучать языку Java
26
JShell• Развивается в рамках проекта Kulla
• http://openjdk.java.net/projects/kulla/
• Интегрирован в openjdk9/dev b90
• Позволяет попробовать синтаксис без написания законченной программы
• Помогает обучать языку Javaclass HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } }
26
JShell• Развивается в рамках проекта Kulla
• http://openjdk.java.net/projects/kulla/
• Интегрирован в openjdk9/dev b90
• Позволяет попробовать синтаксис без написания законченной программы
• Помогает обучать языку Javaclass HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } }
26
Kulla…
27
Кулла?
28
Кулла?
28
Kulla?
29
Kulla?
29
Jshell Demo
30
JShell - примеры
31
JShell - примеры> ./images/jdk/bin/jshell
-> String s=new String("hello");
| Added variable s of type String with initial value “hello”
-> new String("hello");
| Expression value is: "hello"
| assigned to temporary variable $1 of type String
-> System.out.println($1);
h
-> ello
-> System.out.println("Не имей 100 \u20BD, а имей 1 \u00A3 или 32 \u20B4"); System.out.flush();
Не имей 100 ₽, а имей 1 £ или 32 ₴31
Garbage First включен по умолчанию
32
Garbage First включен по умолчанию• Плюсы
• Самый современный GC в HotSpot (хоть и разрабатывается уже 10+ лет)
• Региональный параллельный одновременный коллектор
• Нацелен быть лучшим во всем - Предсказуемые паузы и высокая производительность!
• По умолчанию => Больше пользовательская база => Ошибки находятся быстрее => G1 будет доведен до ума очень быстро
32
Garbage First включен по умолчанию• Плюсы
• Самый современный GC в HotSpot (хоть и разрабатывается уже 10+ лет)
• Региональный параллельный одновременный коллектор
• Нацелен быть лучшим во всем - Предсказуемые паузы и высокая производительность!
• По умолчанию => Больше пользовательская база => Ошибки находятся быстрее => G1 будет доведен до ума очень быстро
• Минусы
• Эргономика работает по-другому. Могут проявиться ошибки в синхронизации в вашем или библиотечном коде
32
Garbage First включен по умолчанию• Плюсы
• Самый современный GC в HotSpot (хоть и разрабатывается уже 10+ лет)
• Региональный параллельный одновременный коллектор
• Нацелен быть лучшим во всем - Предсказуемые паузы и высокая производительность!
• По умолчанию => Больше пользовательская база => Ошибки находятся быстрее => G1 будет доведен до ума очень быстро
• Минусы
• Эргономика работает по-другому. Могут проявиться ошибки в синхронизации в вашем или библиотечном коде
• Жирные минусы
• Есть несовместимости с G1 в Cassandra, Elasticsearch, Lucene, и т.п,. А вы уверены в библиотеках, которые используете?
• Источник (датировано июлем 2015): https://groups.google.com/forum/#!topic/mechanical-sympathy/JxsuVtIIOaY
32
Как пережить смену default GC, не теряя сон
33
Как пережить смену default GC, не теряя сон• Если до сих пор вас устраивали настройки GC по умолчанию
• запаситесь данными эргономики для вашего приложения и среды внедрения
• пропишите явным образом флаги настройки GC в деплоймент скриптах
33
Как пережить смену default GC, не теряя сон• Если до сих пор вас устраивали настройки GC по умолчанию
• запаситесь данными эргономики для вашего приложения и среды внедрения
• пропишите явным образом флаги настройки GC в деплоймент скриптах
• Если вы и ранее явно выбирали GC и флаги GC
• Ничего не изменится, старые коллекторы не исчезнут
33
Как пережить смену default GC, не теряя сон• Если до сих пор вас устраивали настройки GC по умолчанию
• запаситесь данными эргономики для вашего приложения и среды внедрения
• пропишите явным образом флаги настройки GC в деплоймент скриптах
• Если вы и ранее явно выбирали GC и флаги GC
• Ничего не изменится, старые коллекторы не исчезнут
• В обоих случаях - экспериментируйте с G1
33
Как пережить смену default GC, не теряя сон• Если до сих пор вас устраивали настройки GC по умолчанию
• запаситесь данными эргономики для вашего приложения и среды внедрения
• пропишите явным образом флаги настройки GC в деплоймент скриптах
• Если вы и ранее явно выбирали GC и флаги GC
• Ничего не изменится, старые коллекторы не исчезнут
• В обоих случаях - экспериментируйте с G1
• Главное - понимать основные принципы работы GC
• Прежде всего - метрики, которыми оценивают алгоритмы GC
• Что еще почитать: http://www.infoq.com/minibooks/java-garbage-collection33
Обновления языка - Milling Project Coin• Приватные методы в интерфейсах
interface I { private void foo(String s); // Error: private method must declare body. private abstract void foo(int i, int j); // Error: private & abstract: bad combo void foo(int x); // OK. private I foo() { return null; } // OK. }
34
Обновления языка - Milling Project Coin
• Effectively-final переменные могут использоваться в try-with-resources выражениях
35
public static void main(String... args) throws …{ FileReader f = new FileReader(“test.txt”); br =new BufferedReader(fr); try (br) { // do something } catch (Exception ex) { } }
public static void main(String... args) throws …{ FileReader f = new FileReader(“test.txt"); try (br =new BufferedReader(fr)) { // do something } catch (Exception ex) { } }
Обновления языка - Milling Project Coin
• Использование @SafeVarargs в private методах
class VarargsFinalOnly { @SafeVarargs void m(List<String>... args) { } }
36
Обновления языка - Milling Project Coin• Использование diamond с анонимными классами при возможности определения типа, который подразумевается под diamond
37
interface I {} class C {} class B extends C implements I {}
class Test <T extends C & I>{ class A <T>{ public A(T b) { } } public void foo(){ A a = new Test<>().new A<>(new B()){} ; } }
error: cannot infer type arguments for Test.A<> A a = new Test<>().new A<>(new B()){} ; reason: type argument INT#1 inferred for Test.A<> is not allowed in this context inferred argument is not expressible in the Signature attribute where INT#1 is an intersection type: INT#1 extends C,I
Обновления языка - Milling Project Coin• Запрет на использование _ из всех имен типов, констант и т.п.
38
// key: compiler.warn.underscore.as.identifier // options: -source 8 -Xlint:-options
class UnderscoreAsIdentifierWarning { String _ = null; }
Currency API
Источники: https://github.com/JavaMoney/jsr354-api http://javamoney.java.net http://www.infoq.com/articles/ JSR-354-Java-Money-Currency-API39
Currency API• JSR 354: Money and Currency API
Источники: https://github.com/JavaMoney/jsr354-api http://javamoney.java.net http://www.infoq.com/articles/ JSR-354-Java-Money-Currency-API39
Currency API• JSR 354: Money and Currency API
• Функциональность включает:
Источники: https://github.com/JavaMoney/jsr354-api http://javamoney.java.net http://www.infoq.com/articles/ JSR-354-Java-Money-Currency-API39
Currency API• JSR 354: Money and Currency API
• Функциональность включает:
• Специальное форматирование (например INR 12,23,123.34)
Источники: https://github.com/JavaMoney/jsr354-api http://javamoney.java.net http://www.infoq.com/articles/ JSR-354-Java-Money-Currency-API39
Currency API• JSR 354: Money and Currency API
• Функциональность включает:
• Специальное форматирование (например INR 12,23,123.34)
• thread safe format classes
Источники: https://github.com/JavaMoney/jsr354-api http://javamoney.java.net http://www.infoq.com/articles/ JSR-354-Java-Money-Currency-API39
Currency API• JSR 354: Money and Currency API
• Функциональность включает:
• Специальное форматирование (например INR 12,23,123.34)
• thread safe format classes
• новая абстракция для финансовой арифметики (чтобы не использовать BigDecimal)
Источники: https://github.com/JavaMoney/jsr354-api http://javamoney.java.net http://www.infoq.com/articles/ JSR-354-Java-Money-Currency-API39
Currency API• JSR 354: Money and Currency API
• Функциональность включает:
• Специальное форматирование (например INR 12,23,123.34)
• thread safe format classes
• новая абстракция для финансовой арифметики (чтобы не использовать BigDecimal)
• валюты не в ISO стандарте (виртуальные, из истории, придуманные)
Источники: https://github.com/JavaMoney/jsr354-api http://javamoney.java.net http://www.infoq.com/articles/ JSR-354-Java-Money-Currency-API39
Currency API• JSR 354: Money and Currency API
• Функциональность включает:
• Специальное форматирование (например INR 12,23,123.34)
• thread safe format classes
• новая абстракция для финансовой арифметики (чтобы не использовать BigDecimal)
• валюты не в ISO стандарте (виртуальные, из истории, придуманные)
• API для конвертации валют Источники: https://github.com/JavaMoney/jsr354-api http://javamoney.java.net http://www.infoq.com/articles/ JSR-354-Java-Money-Currency-API39
Currency API• JSR 354: Money and Currency API
• Функциональность включает:
• Специальное форматирование (например INR 12,23,123.34)
• thread safe format classes
• новая абстракция для финансовой арифметики (чтобы не использовать BigDecimal)
• валюты не в ISO стандарте (виртуальные, из истории, придуманные)
• API для конвертации валют
• ExchangeRate providers
Источники: https://github.com/JavaMoney/jsr354-api http://javamoney.java.net http://www.infoq.com/articles/ JSR-354-Java-Money-Currency-API39
Currency API• JSR 354: Money and Currency API
• Функциональность включает:
• Специальное форматирование (например INR 12,23,123.34)
• thread safe format classes
• новая абстракция для финансовой арифметики (чтобы не использовать BigDecimal)
• валюты не в ISO стандарте (виртуальные, из истории, придуманные)
• API для конвертации валют
• ExchangeRate providers
Источники: https://github.com/JavaMoney/jsr354-api http://javamoney.java.net http://www.infoq.com/articles/ JSR-354-Java-Money-Currency-API
Collection<CurrencyUnit> currencies = Monetary.getCurrencies (CurrencyQueryBuilder.of().set ("continent", "Europe").set (Year.of(2015)).build());
39
Обновление Process API
Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
Обновление Process API• JEP 102: Process API Updates
Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
Обновление Process API• JEP 102: Process API Updates
• Новое:
Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
Обновление Process API• JEP 102: Process API Updates
• Новое:
• Получить pid “своей” JVM
Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
Обновление Process API• JEP 102: Process API Updates
• Новое:
• Получить pid “своей” JVM
• Получить список процессов системы
Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
Обновление Process API• JEP 102: Process API Updates
• Новое:
• Получить pid “своей” JVM
• Получить список процессов системы
• Работа с деревьями процессов
Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
Обновление Process API• JEP 102: Process API Updates
• Новое:
• Получить pid “своей” JVM
• Получить список процессов системы
• Работа с деревьями процессов
Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/
Process proc = Runtime.getRuntime() .exec(new String[]{ "/bin/sh", “-c", "echo $PPID" }); if (proc.waitFor() == 0) { InputStream in = proc.getInputStream(); int available = in.available(); byte[] outputBytes = new byte[available]; in.read(outputBytes); String pid = new String(outputBytes); System.out.println("Your pid is " + pid) }
40
Обновление Process API• JEP 102: Process API Updates
• Новое:
• Получить pid “своей” JVM
• Получить список процессов системы
• Работа с деревьями процессов
Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/
Process proc = Runtime.getRuntime() .exec(new String[]{ "/bin/sh", “-c", "echo $PPID" }); if (proc.waitFor() == 0) { InputStream in = proc.getInputStream(); int available = in.available(); byte[] outputBytes = new byte[available]; in.read(outputBytes); String pid = new String(outputBytes); System.out.println("Your pid is " + pid) }
System.out.println("Your pid is " + ProcessHandle.current().getPid());
40
Обзор JEP-ов. Что уберут?
41
Обзор JEP-ов. Что уберут?• 231: Remove Launch-Time JRE Version Selection
41
Обзор JEP-ов. Что уберут?• 231: Remove Launch-Time JRE Version Selection
• 240: Remove the JVM TI hprof Agent
41
Обзор JEP-ов. Что уберут?• 231: Remove Launch-Time JRE Version Selection
• 240: Remove the JVM TI hprof Agent
• 241: Remove the jhat Tool———————————
41
Обзор JEP-ов. Что уберут?• 231: Remove Launch-Time JRE Version Selection
• 240: Remove the JVM TI hprof Agent
• 241: Remove the jhat Tool———————————
• Последствия подулярности (JEP - 261)
• -Xbootclasspath & -Xbootclasspath/p
• system property sun.boot.class.path
41
Обзор JEP-ов. Что уберут?• 231: Remove Launch-Time JRE Version Selection
• 240: Remove the JVM TI hprof Agent
• 241: Remove the jhat Tool———————————
• Последствия подулярности (JEP - 261)
• -Xbootclasspath & -Xbootclasspath/p
• system property sun.boot.class.path
41
Обзор JEP-ов. Ключевые API
42
Обзор JEP-ов. Ключевые API
• 261, 162, 200, 201, 220, 260, 261 Модули и модулярность.
42
Обзор JEP-ов. Ключевые API
• 261, 162, 200, 201, 220, 260, 261 Модули и модулярность.
• 102: Process API Updates
42
Обзор JEP-ов. Ключевые API
• 261, 162, 200, 201, 220, 260, 261 Модули и модулярность.
• 102: Process API Updates
• 230: Microbenchmark Suite
42
Обзор JEP-ов. Ключевые API
• 261, 162, 200, 201, 220, 260, 261 Модули и модулярность.
• 102: Process API Updates
• 230: Microbenchmark Suite
• 193: Variable Handles (?)
42
Обзор JEP-ов. Ключевые API
• 261, 162, 200, 201, 220, 260, 261 Модули и модулярность.
• 102: Process API Updates
• 230: Microbenchmark Suite
• 193: Variable Handles (?)
• 227: Unicode 7.0
42
Обзор JEP-ов. Ключевые API
• 261, 162, 200, 201, 220, 260, 261 Модули и модулярность.
• 102: Process API Updates
• 230: Microbenchmark Suite
• 193: Variable Handles (?)
• 227: Unicode 7.0
42
Обзор JEP-ов. Ключевые API
• 261, 162, 200, 201, 220, 260, 261 Модули и модулярность.
• 102: Process API Updates
• 230: Microbenchmark Suite
• 193: Variable Handles (?)
• 227: Unicode 7.0 & 267: Unicode 8.0
42
Обзор JEP-ов. Ключевые API
• 261, 162, 200, 201, 220, 260, 261 Модули и модулярность.
• 102: Process API Updates
• 230: Microbenchmark Suite
• 193: Variable Handles (?)
• 227: Unicode 7.0 & 267: Unicode 8.0
42
Обзор JEP-ов. Ключевые API
• 261, 162, 200, 201, 220, 260, 261 Модули и модулярность.
• 102: Process API Updates
• 230: Microbenchmark Suite
• 193: Variable Handles (?)
• 227: Unicode 7.0 & 267: Unicode 8.0
42
Обзор JEP-ов. Графика
43
Обзор JEP-ов. Графика• 258: HarfBuzz Font-Layout Engine
43
Обзор JEP-ов. Графика• 258: HarfBuzz Font-Layout Engine
• 263: HiDPI Graphics on Windows and Linux
43
Обзор JEP-ов. Графика• 258: HarfBuzz Font-Layout Engine
• 263: HiDPI Graphics on Windows and Linux
• 265: Marlin Graphics Renderer
43
Обзор JEP-ов. Графика• 258: HarfBuzz Font-Layout Engine
• 263: HiDPI Graphics on Windows and Linux
• 265: Marlin Graphics Renderer
• 262: TIFF Image I/O
43
Обзор JEP-ов. Графика• 258: HarfBuzz Font-Layout Engine
• 263: HiDPI Graphics on Windows and Linux
• 265: Marlin Graphics Renderer
• 262: TIFF Image I/O
• 257: Update JavaFX/Media to Newer Version of GStreamer (1.4.4)
43
Обзор JEP-ов. Графика• 258: HarfBuzz Font-Layout Engine
• 263: HiDPI Graphics on Windows and Linux
• 265: Marlin Graphics Renderer
• 262: TIFF Image I/O
• 257: Update JavaFX/Media to Newer Version of GStreamer (1.4.4)
• 251: Multi-Resolution Images
43
Обзор JEP-ов. Производительность
44
Обзор JEP-ов. Производительность
• 143: Improve Contended Locking
44
Обзор JEP-ов. Производительность
• 143: Improve Contended Locking
• 266: More Concurrency Updates
44
Обзор JEP-ов. Производительность
• 143: Improve Contended Locking
• 266: More Concurrency Updates
• 197: Segmented Code Cache
44
Обзор JEP-ов. Производительность
• 143: Improve Contended Locking
• 266: More Concurrency Updates
• 197: Segmented Code Cache
• 165: Compiler Control
44
Обзор JEP-ов. Производительность
• 143: Improve Contended Locking
• 266: More Concurrency Updates
• 197: Segmented Code Cache
• 165: Compiler Control
• 243: Java-Level JVM Compiler Interface
44
Обзор JEP-ов. Производительность
• 143: Improve Contended Locking
• 266: More Concurrency Updates
• 197: Segmented Code Cache
• 165: Compiler Control
• 243: Java-Level JVM Compiler Interface
• 246: Leverage CPU Instructions for GHASH and RSA
44
Обзор JEP-ов. Производительность
• 143: Improve Contended Locking
• 266: More Concurrency Updates
• 197: Segmented Code Cache
• 165: Compiler Control
• 243: Java-Level JVM Compiler Interface
• 246: Leverage CPU Instructions for GHASH and RSA
• 250: Store Interned Strings in CDS Archives
44
Обзор JEP-ов. Производительность
• 143: Improve Contended Locking
• 266: More Concurrency Updates
• 197: Segmented Code Cache
• 165: Compiler Control
• 243: Java-Level JVM Compiler Interface
• 246: Leverage CPU Instructions for GHASH and RSA
• 250: Store Interned Strings in CDS Archives
• 254: Compact Strings
44
Обзор JEP-ов. Безопасность
45
Обзор JEP-ов. Безопасность
• 219: Datagram Transport Layer Security (DTLS)
• 229: Create PKCS12 Keystores by Default
• 244: TLS Application-Layer Protocol Negotiation Extension
• 249: OCSP Stapling for TLS
45
Про Azul Systems
46
Про Azul Systems• Zing: A better JVM for the enterprise
• Azul’s innovative Java runtime for business applications• Certified Java SE builds• Removes GC as a factor in your operation• Supports large in-memory data stores• Solves Java’s “warm-up” problem• Runs on distros of RHEL, Ubuntu, SLES and CentOS
46
Про Azul Systems• Zing: A better JVM for the enterprise
• Azul’s innovative Java runtime for business applications• Certified Java SE builds• Removes GC as a factor in your operation• Supports large in-memory data stores• Solves Java’s “warm-up” problem• Runs on distros of RHEL, Ubuntu, SLES and CentOS
•Zulu: Java when all you need is Support • Free and Open Source (based on OpenJDK)• Certified Java SE builds• Runs on Windows, Linux & Mac• Performance parity with Oracle Hotspot• Optional customized “embedded” offerings
46
47
Заключение
47
Спасибо
Время вопросов и ответов
@JohnWings
48
49
Backup слайды@SafeVarargs
49
Backup слайды@SafeVarargs
@SafeVarargs // Not actually safe!
static void m(List<String>... stringLists) {
Object[] array = stringLists;
List<Integer> tmpList = Arrays.asList(42);
array[0] = tmpList; // Semantically invalid, but compiles without warnings
String s = stringLists[0].get(0); // Oh no, ClassCastException at runtime!
}
JEP process
50
Source: http://cr.openjdk.java.net/~mr/jep/jep-2.0-02.html
that’s it
51