SlideShare a Scribd company logo
Чего ждать от 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/Facepalm
New 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 9Featurecomplete
ZeroBugBounce
Rampdownphase2
FinalReleaseCandidate
Дек’15
Alltestsrun
RampdownStart
GeneralAvailability
Фев’16
Фев’16
Апр’16
Июнь’16
Июль’16
Сент’16
9
Ориентировочное
расписание выхода Java 9Featurecomplete
ZeroBugBounce
Rampdownphase2
FinalReleaseCandidate
Дек’15
Alltestsrun
RampdownStart
GeneralAvailability
Фев’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 System

JEP 261: Module System

Модулярность
JDK
Модули в Java
13
Jigsaw
JEP 162: Prepare for Modularization

JEP 200: The Modular JDK

JEP 220: Modular Run-Time Images

JEP 201: Modular Source Code

JEP 260: Encapsulate Most Internal
APIs

JSR 376: Java Platform Module System

JEP 261: Module System

Модулярность
JDK
Модули в Java
13
Пример 1
14
Пример 1Модуль S Модуль P
14
Пример 1
src/s/module-info.java
module s {
exports com.azul.services;
}
src/p/module-info.java
module p {
requires s;
}
Модуль S Модуль P
14
Пример 1
src/s/module-info.java
module s {
exports com.azul.services;
}
src/p/module-info.java
module p {
requires s;
}
Модуль S Модуль P
14
Пример 1
src/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 -jdkinternals
glassfish-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.html
22
Модулярность
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
• Позволяет попробовать синтаксис без написания законченной
программы
• Помогает обучать языку Java
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
26
JShell
• Развивается в рамках проекта Kulla 

• http://openjdk.java.net/projects/kulla/
• Интегрирован в openjdk9/dev b90
• Позволяет попробовать синтаксис без написания законченной
программы
• Помогает обучать языку Java
class 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-collection
33
Обновления языка - 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

More Related Content

PDF
Разговор про Java 9. Extended version
PDF
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
PDF
Excelsior JET в действии
PPTX
Java Ahead-Of-Time compilation
PPTX
Java 9 Модули. Почему не OSGi?
PPTX
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
PPTX
Клиентская Java вне браузера. Делаем нативные клиенты на Java
PPTX
JVM: краткий курс общей анатомии
Разговор про Java 9. Extended version
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Excelsior JET в действии
Java Ahead-Of-Time compilation
Java 9 Модули. Почему не OSGi?
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
Клиентская Java вне браузера. Делаем нативные клиенты на Java
JVM: краткий курс общей анатомии

What's hot (20)

PDF
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
PPTX
Поддержка Java 8 в Excelsior JET
PDF
Java худеет. Спроси меня как.
PPTX
Java 8 Support at the JVM Level
ODP
Java 9 - Back to the Future
PDF
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
PDF
Java осень 2014 занятие 1
PDF
Эволюция ZF: архитектура, шаблоны, рефакторинг
PDF
Встречайте Zend Framework 2.0
PDF
Scala Rock-Painting
PDF
How to cook a blockchain and not get burned
PPTX
Test driven development in net
PDF
Илья Кудинов
PPTX
Верификация Java байткода: когда, как, а может отключить?
PPTX
Maven 3 : уличная магия
PPT
Client Side Autotesting Flash
PPTX
Silverlight 4, есть ли жизнь на десктопе
PPTX
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
PDF
BDD girls Battle: Cucumber VS. JBehave
PDF
Jiramania презентации @augspb
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Поддержка Java 8 в Excelsior JET
Java худеет. Спроси меня как.
Java 8 Support at the JVM Level
Java 9 - Back to the Future
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Java осень 2014 занятие 1
Эволюция ZF: архитектура, шаблоны, рефакторинг
Встречайте Zend Framework 2.0
Scala Rock-Painting
How to cook a blockchain and not get burned
Test driven development in net
Илья Кудинов
Верификация Java байткода: когда, как, а может отключить?
Maven 3 : уличная магия
Client Side Autotesting Flash
Silverlight 4, есть ли жизнь на десктопе
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
BDD girls Battle: Cucumber VS. JBehave
Jiramania презентации @augspb
Ad

Similar to What to expect from Java 9 (20)

PPTX
Java 9 модули
PDF
Java in Motion
PDF
Процесс изменения платформы Java
PPTX
Модули в Java
PDF
Занимательные истории из жизни технической поддержки JVM
PDF
Полезное покрытие кода
PDF
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
PDF
Zero Downtime PHP Deployment with Envoyer And Forge
PPTX
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
PPTX
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
ODP
Документирование исходных текстов (javadoc)
PDF
Java Platform Performance BoF
PDF
Unsafe: to be or to be removed?
PPTX
Оптимизация производительности нагруженных веб-систем на Java
PPTX
PostgreSQL. Стильно. Модно. Молодёжно
PDF
Синхронизация без блокировок и СМС
PPTX
Java 9: Platform
PDF
[jeeconf-2011] Java Platform Performance BoF
PDF
AOT-компиляция Java
PDF
Tech Talks @NSU: AOT-компиляция Java
Java 9 модули
Java in Motion
Процесс изменения платформы Java
Модули в Java
Занимательные истории из жизни технической поддержки JVM
Полезное покрытие кода
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Zero Downtime PHP Deployment with Envoyer And Forge
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Документирование исходных текстов (javadoc)
Java Platform Performance BoF
Unsafe: to be or to be removed?
Оптимизация производительности нагруженных веб-систем на Java
PostgreSQL. Стильно. Модно. Молодёжно
Синхронизация без блокировок и СМС
Java 9: Platform
[jeeconf-2011] Java Platform Performance BoF
AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция Java
Ad

More from JavaDayUA (20)

PDF
STEMing Kids: One workshop at a time
PDF
Flavors of Concurrency in Java
PDF
Continuously building, releasing and deploying software: The Revenge of the M...
PDF
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
PDF
20 Years of Java
PDF
How to get the most out of code reviews
PDF
Unlocking the Magic of Monads with Java 8
PDF
Virtual Private Cloud with container technologies for DevOps
PPTX
JShell: An Interactive Shell for the Java Platform
PPTX
Interactive Java Support to your tool -- The JShell API and Architecture
PDF
MapDB - taking Java collections to the next level
PDF
Save Java memory
PDF
Design rationales in the JRockit JVM
PPTX
Next-gen DevOps engineering with Docker and Kubernetes by Antons Kranga
PPTX
Apache Cassandra. Inception - all you need to know by Mikhail Dubkov
PPTX
Solution Architecture tips & tricks by Roman Shramkov
PPTX
Testing in Legacy: from Rags to Riches by Taras Slipets
PDF
Reactive programming and Hystrix fault tolerance by Max Myslyvtsev
PDF
Spark-driven audience counting by Boris Trofimov
PDF
API first with Swagger and Scala by Slava Schmidt
STEMing Kids: One workshop at a time
Flavors of Concurrency in Java
Continuously building, releasing and deploying software: The Revenge of the M...
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
20 Years of Java
How to get the most out of code reviews
Unlocking the Magic of Monads with Java 8
Virtual Private Cloud with container technologies for DevOps
JShell: An Interactive Shell for the Java Platform
Interactive Java Support to your tool -- The JShell API and Architecture
MapDB - taking Java collections to the next level
Save Java memory
Design rationales in the JRockit JVM
Next-gen DevOps engineering with Docker and Kubernetes by Antons Kranga
Apache Cassandra. Inception - all you need to know by Mikhail Dubkov
Solution Architecture tips & tricks by Roman Shramkov
Testing in Legacy: from Rags to Riches by Taras Slipets
Reactive programming and Hystrix fault tolerance by Max Myslyvtsev
Spark-driven audience counting by Boris Trofimov
API first with Swagger and Scala by Slava Schmidt

What to expect from Java 9

  • 1. Чего ждать от Java 9? Иван Крылов 1
  • 3. Зачем этот доклад? • До выхода JDK9 меньше года • Знать об изменениях лучше заранее 2
  • 4. Зачем этот доклад? • До выхода JDK9 меньше года • Знать об изменениях лучше заранее • Я работаю в Azul Systems - производителе JDK • Я - сторонний заинтересованный наблюдатель развития платформы • Вся информация из публичных источников 2
  • 5. Переход на новую версию Java 3
  • 6. Переход на новую версию Java New features!Новые возможности! 3
  • 7. Переход на новую версию Java New features!Новые возможности! New incompatibilities!Источник ошибок и несовместимостей 3
  • 8. Переход на новую версию Java Изображения - Ihttps://vijaybelola.wordpress.com/2011/09/20/let-the-games-begin/ ; https://ru.wikipedia.org/wiki/Facepalm New features!Новые возможности! New incompatibilities!Источник ошибок и несовместимостей 3
  • 10. Временные интервалы выхода версий Java JDK 6
 Дек 2006 JDK 7
 Июль 2011 JDK 8
 Мар 2014 JDK 9
 план. Сент 2016 4 GA
  • 11. Временные интервалы выхода версий 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
  • 13. Что означает наступление дня EOL? Настал день EOL Нужны исправления найденных уязвимостей & 5
  • 14. Что означает наступление дня EOL? Настал день EOL Нужны исправления найденных уязвимостей & 5
  • 15. Что означает наступление дня EOL? Настал день EOL Нужны исправления найденных уязвимостей & Подписать Support Contract c Oracle 5
  • 16. Что означает наступление дня EOL? Настал день EOL Нужны исправления найденных уязвимостей & Подписать Support Contract c Oracle Перейти на OpenJDK (Zulu, IcedTea, сборку своими силами) 5
  • 17. Что означает наступление дня EOL? Настал день EOL Нужны исправления найденных уязвимостей & Подписать Support Contract c Oracle Перейти на OpenJDK (Zulu, IcedTea, сборку своими силами) Обновиться до следующей версии JDK 5
  • 19. Вспомним новое в Java 8 • Лямбды • Method references • Type аннотации • Повторяющиеся аннотации • Интерфейсные методы 6
  • 20. Вспомним новое в Java 8 • Лямбды • Method references • Type аннотации • Повторяющиеся аннотации • Интерфейсные методы 6 • Stream API • Date Time API • Замена PermGen • Nashorn, JavaScript Engine • Новые утилиты (jdeps,jjs,..)
  • 21. От идей до нового функционала Java 7
  • 22. От идей до нового функционала Java JEP предложен 7
  • 23. От идей до нового функционала Java JEP предложен JEP принят, найден “спонсор” 7
  • 24. От идей до нового функционала Java JEP предложен JEP принят, найден “спонсор” JEP подтвержден для Java версии N 7
  • 25. От идей до нового функционала Java JEP предложен JEP принят, найден “спонсор” JEP подтвержден для Java версии N JEP реализован 7
  • 29. Ориентировочное расписание выхода Java 9Featurecomplete ZeroBugBounce Rampdownphase2 FinalReleaseCandidate Дек’15 Alltestsrun RampdownStart GeneralAvailability Фев’16 Фев’16 Апр’16 Июнь’16 Июль’16 Сент’16 9
  • 30. Ориентировочное расписание выхода Java 9Featurecomplete ZeroBugBounce Rampdownphase2 FinalReleaseCandidate Дек’15 Alltestsrun RampdownStart GeneralAvailability Фев’16 Фев’16 Апр’16 Июнь’16 Июль’16 Сент’16 9
  • 32. 10
  • 40. Проблемы существующей модели • Java Runtime большой и “тяжелый” и будет дальше расти 12
  • 41. Проблемы существующей модели • Java Runtime большой и “тяжелый” и будет дальше расти • Профайлы 1, 2, 3 лишь частично решают проблему 12
  • 42. Проблемы существующей модели • Java Runtime большой и “тяжелый” и будет дальше расти • Профайлы 1, 2, 3 лишь частично решают проблему • Jar / Classpath Hell 12
  • 43. Проблемы существующей модели • Java Runtime большой и “тяжелый” и будет дальше расти • Профайлы 1, 2, 3 лишь частично решают проблему • Jar / Classpath Hell • Что от чего зависит?.. 12
  • 44. Проблемы существующей модели • Java Runtime большой и “тяжелый” и будет дальше расти • Профайлы 1, 2, 3 лишь частично решают проблему • Jar / Classpath Hell • Что от чего зависит?.. • Опциональные и транзитивные зависимости 12
  • 45. Проблемы существующей модели • Java Runtime большой и “тяжелый” и будет дальше расти • Профайлы 1, 2, 3 лишь частично решают проблему • Jar / Classpath Hell • Что от чего зависит?.. • Опциональные и транзитивные зависимости • Ленивая загрузка и инициализация классов -> NoClassDefFoundError 12
  • 46. Проблемы существующей модели • Java Runtime большой и “тяжелый” и будет дальше расти • Профайлы 1, 2, 3 лишь частично решают проблему • Jar / Classpath Hell • Что от чего зависит?.. • Опциональные и транзитивные зависимости • Ленивая загрузка и инициализация классов -> NoClassDefFoundError • Примитивный механизм видимости для кода вне пакетов - только public 12
  • 47. Проблемы существующей модели • Java Runtime большой и “тяжелый” и будет дальше расти • Профайлы 1, 2, 3 лишь частично решают проблему • Jar / Classpath Hell • Что от чего зависит?.. • Опциональные и транзитивные зависимости • Ленивая загрузка и инициализация классов -> NoClassDefFoundError • Примитивный механизм видимости для кода вне пакетов - только public • Классы из разных загрузчиков классов “видят” друг друга 12
  • 48. Проблемы существующей модели • Java Runtime большой и “тяжелый” и будет дальше расти • Профайлы 1, 2, 3 лишь частично решают проблему • Jar / Classpath Hell • Что от чего зависит?.. • Опциональные и транзитивные зависимости • Ленивая загрузка и инициализация классов -> NoClassDefFoundError • Примитивный механизм видимости для кода вне пакетов - только public • Классы из разных загрузчиков классов “видят” друг друга • SecurityManager помогает, но об этом надо знать 12
  • 52. Jigsaw JSR 376: Java Platform Module System JEP 261: Module System
 Модулярность JDK Модули в Java 13
  • 53. Jigsaw JEP 162: Prepare for Modularization JEP 200: The Modular JDK
 JEP 220: Modular Run-Time Images JEP 201: Modular Source Code JEP 260: Encapsulate Most Internal APIs
 JSR 376: Java Platform Module System JEP 261: Module System
 Модулярность JDK Модули в Java 13
  • 55. Пример 1Модуль S Модуль P 14
  • 56. Пример 1 src/s/module-info.java module s { exports com.azul.services; } src/p/module-info.java module p { requires s; } Модуль S Модуль P 14
  • 57. Пример 1 src/s/module-info.java module s { exports com.azul.services; } src/p/module-info.java module p { requires s; } Модуль S Модуль P 14
  • 58. Пример 1 src/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
  • 60. Новые параметры 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
  • 62. Новые параметры 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
  • 64. Пример 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
  • 65. Пример 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
  • 66. Пример 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
  • 67. Пример 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
  • 68. Пример 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
  • 69. Пример 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
  • 70. Пример 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
  • 71. Пример 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
  • 73. Cосуществование cp и mp • Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль 18
  • 74. Cосуществование cp и mp • Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль • Безымянные модули видят все именованные модули (requires *) 18
  • 75. Cосуществование cp и mp • Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль • Безымянные модули видят все именованные модули (requires *) • Обратное - неверное, надо указать requires unnamed или … 18
  • 76. Cосуществование cp и mp • Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль • Безымянные модули видят все именованные модули (requires *) • Обратное - неверное, надо указать requires unnamed или … • jar файл, который попал в mp автоматически превращается в модуль с названием, совпадающим с названием jar-файла 18
  • 77. Cосуществование cp и mp • Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль • Безымянные модули видят все именованные модули (requires *) • Обратное - неверное, надо указать requires unnamed или … • jar файл, который попал в mp автоматически превращается в модуль с названием, совпадающим с названием jar-файла • автомодули становятся мостом для видимости именными модулями классов в безымянным модуле 18
  • 78. Cосуществование cp и mp • Всё, что попало в cp считается попавшим в безымянный (unnamed) модуль • Безымянные модули видят все именованные модули (requires *) • Обратное - неверное, надо указать requires unnamed или … • jar файл, который попал в mp автоматически превращается в модуль с названием, совпадающим с названием jar-файла • автомодули становятся мостом для видимости именными модулями классов в безымянным модуле • Типы ищутся безымянном модуле в последнюю очередь 18
  • 79. 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
  • 80. 20 jdeps -jdkinternals glassfish-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
  • 86. О чем я не расскажу сегодня 23
  • 87. О чем я не расскажу сегодня 23 • Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн
  • 88. О чем я не расскажу сегодня 23 • Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн • Модуляризованный jar; multirelease jar
  • 89. О чем я не расскажу сегодня 23 • Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн • Модуляризованный jar; multirelease jar • Пакеты с одинаковыми названиями и внезапные NoClassDefFoundException
  • 90. О чем я не расскажу сегодня 23 • Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн • Модуляризованный jar; multirelease jar • Пакеты с одинаковыми названиями и внезапные NoClassDefFoundException • Layers - новая абстракция над classloaders
  • 91. О чем я не расскажу сегодня 23 • Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн • Модуляризованный jar; multirelease jar • Пакеты с одинаковыми названиями и внезапные NoClassDefFoundException • Layers - новая абстракция над classloaders • Инструментарий для модуляризации кода • <java9_jigsaw>/bin/jdeps -help • IDE скоро помогут
  • 92. О чем я не расскажу сегодня 23 • Reflection и модули. Новый класс java.lang.reflect.Module. Видимость и рефлекшн • Модуляризованный jar; multirelease jar • Пакеты с одинаковыми названиями и внезапные NoClassDefFoundException • Layers - новая абстракция над classloaders • Инструментарий для модуляризации кода • <java9_jigsaw>/bin/jdeps -help • IDE скоро помогут • Циркулярные зависимости между модулями через загрузчики модулей и как их избежать
  • 93. (Мои) Выводы про модули в Java 9 24
  • 94. (Мои) Выводы про модули в Java 9 • Цель - явное обязательное указание зависимостей 24
  • 95. (Мои) Выводы про модули в Java 9 • Цель - явное обязательное указание зависимостей • Пересечение с OSGi незначительное 24
  • 96. (Мои) Выводы про модули в Java 9 • Цель - явное обязательное указание зависимостей • Пересечение с OSGi незначительное • Предоставляет новые возможности по оптимизации 24
  • 97. (Мои) Выводы про модули в Java 9 • Цель - явное обязательное указание зависимостей • Пересечение с OSGi незначительное • Предоставляет новые возможности по оптимизации • Сохранена совместимость с jar/cp (именные м., безымянный м., автомодули) 24
  • 98. (Мои) Выводы про модули в Java 9 • Цель - явное обязательное указание зависимостей • Пересечение с OSGi незначительное • Предоставляет новые возможности по оптимизации • Сохранена совместимость с jar/cp (именные м., безымянный м., автомодули) • jigsaw теряет функциональность на пути к финалу • поддержка версий была еще весной 2015, осталась лишь декларация 24
  • 99. (Мои) Выводы про модули в Java 9 • Цель - явное обязательное указание зависимостей • Пересечение с OSGi незначительное • Предоставляет новые возможности по оптимизации • Сохранена совместимость с jar/cp (именные м., безымянный м., автомодули) • jigsaw теряет функциональность на пути к финалу • поддержка версий была еще весной 2015, осталась лишь декларация • IDEs учатся работать с модулями 24
  • 100. Jigsaw - статус, ссылки 25
  • 101. Jigsaw - статус, ссылки • Работа продолжается 25
  • 102. Jigsaw - статус, ссылки • Работа продолжается • Статья о текущем состоянии (Сентябрь 2015) • http://openjdk.java.net/projects/jigsaw/spec/sotms/ 25
  • 103. Jigsaw - статус, ссылки • Работа продолжается • Статья о текущем состоянии (Сентябрь 2015) • http://openjdk.java.net/projects/jigsaw/spec/sotms/ • Доклады с JavaOne (октябрь 2015) • http://openjdk.java.net/projects/jigsaw/j1/ 25
  • 104. 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
  • 105. 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
  • 107. JShell • Развивается в рамках проекта Kulla • http://openjdk.java.net/projects/kulla/ 26
  • 108. JShell • Развивается в рамках проекта Kulla • http://openjdk.java.net/projects/kulla/ • Интегрирован в openjdk9/dev b90 26
  • 109. JShell • Развивается в рамках проекта Kulla • http://openjdk.java.net/projects/kulla/ • Интегрирован в openjdk9/dev b90 • Позволяет попробовать синтаксис без написания законченной программы 26
  • 110. JShell • Развивается в рамках проекта Kulla • http://openjdk.java.net/projects/kulla/ • Интегрирован в openjdk9/dev b90 • Позволяет попробовать синтаксис без написания законченной программы • Помогает обучать языку Java 26
  • 111. JShell • Развивается в рамках проекта Kulla • http://openjdk.java.net/projects/kulla/ • Интегрирован в openjdk9/dev b90 • Позволяет попробовать синтаксис без написания законченной программы • Помогает обучать языку Java class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } 26
  • 112. JShell • Развивается в рамках проекта Kulla • http://openjdk.java.net/projects/kulla/ • Интегрирован в openjdk9/dev b90 • Позволяет попробовать синтаксис без написания законченной программы • Помогает обучать языку Java class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } 26
  • 120. 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
  • 121. Garbage First включен по умолчанию 32
  • 122. Garbage First включен по умолчанию • Плюсы • Самый современный GC в HotSpot (хоть и разрабатывается уже 10+ лет) • Региональный параллельный одновременный коллектор • Нацелен быть лучшим во всем - Предсказуемые паузы и высокая производительность! • По умолчанию => Больше пользовательская база => Ошибки находятся быстрее => G1 будет доведен до ума очень быстро 32
  • 123. Garbage First включен по умолчанию • Плюсы • Самый современный GC в HotSpot (хоть и разрабатывается уже 10+ лет) • Региональный параллельный одновременный коллектор • Нацелен быть лучшим во всем - Предсказуемые паузы и высокая производительность! • По умолчанию => Больше пользовательская база => Ошибки находятся быстрее => G1 будет доведен до ума очень быстро • Минусы • Эргономика работает по-другому. Могут проявиться ошибки в синхронизации в вашем или библиотечном коде 32
  • 124. Garbage First включен по умолчанию • Плюсы • Самый современный GC в HotSpot (хоть и разрабатывается уже 10+ лет) • Региональный параллельный одновременный коллектор • Нацелен быть лучшим во всем - Предсказуемые паузы и высокая производительность! • По умолчанию => Больше пользовательская база => Ошибки находятся быстрее => G1 будет доведен до ума очень быстро • Минусы • Эргономика работает по-другому. Могут проявиться ошибки в синхронизации в вашем или библиотечном коде • Жирные минусы • Есть несовместимости с G1 в Cassandra, Elasticsearch, Lucene, и т.п,. А вы уверены в библиотеках, которые используете? • Источник (датировано июлем 2015): https://groups.google.com/forum/#!topic/mechanical-sympathy/JxsuVtIIOaY 32
  • 125. Как пережить смену default GC, не теряя сон 33
  • 126. Как пережить смену default GC, не теряя сон • Если до сих пор вас устраивали настройки GC по умолчанию • запаситесь данными эргономики для вашего приложения и среды внедрения • пропишите явным образом флаги настройки GC в деплоймент скриптах 33
  • 127. Как пережить смену default GC, не теряя сон • Если до сих пор вас устраивали настройки GC по умолчанию • запаситесь данными эргономики для вашего приложения и среды внедрения • пропишите явным образом флаги настройки GC в деплоймент скриптах • Если вы и ранее явно выбирали GC и флаги GC • Ничего не изменится, старые коллекторы не исчезнут 33
  • 128. Как пережить смену default GC, не теряя сон • Если до сих пор вас устраивали настройки GC по умолчанию • запаситесь данными эргономики для вашего приложения и среды внедрения • пропишите явным образом флаги настройки GC в деплоймент скриптах • Если вы и ранее явно выбирали GC и флаги GC • Ничего не изменится, старые коллекторы не исчезнут • В обоих случаях - экспериментируйте с G1 33
  • 129. Как пережить смену default GC, не теряя сон • Если до сих пор вас устраивали настройки GC по умолчанию • запаситесь данными эргономики для вашего приложения и среды внедрения • пропишите явным образом флаги настройки GC в деплоймент скриптах • Если вы и ранее явно выбирали GC и флаги GC • Ничего не изменится, старые коллекторы не исчезнут • В обоих случаях - экспериментируйте с G1 • Главное - понимать основные принципы работы GC • Прежде всего - метрики, которыми оценивают алгоритмы GC • Что еще почитать: http://www.infoq.com/minibooks/java-garbage-collection 33
  • 130. Обновления языка - 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
  • 131. Обновления языка - 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) { } }
  • 132. Обновления языка - Milling Project Coin • Использование @SafeVarargs в private методах class VarargsFinalOnly { @SafeVarargs void m(List<String>... args) { } } 36
  • 133. Обновления языка - 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
  • 134. Обновления языка - Milling Project Coin • Запрет на использование _ из всех имен типов, констант и т.п. 38 // key: compiler.warn.underscore.as.identifier // options: -source 8 -Xlint:-options class UnderscoreAsIdentifierWarning { String _ = null; }
  • 136. 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
  • 137. 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
  • 138. 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
  • 139. 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
  • 140. 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
  • 141. 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
  • 142. 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
  • 143. 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
  • 144. 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
  • 145. Обновление Process API Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
  • 146. Обновление Process API • JEP 102: Process API Updates Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
  • 147. Обновление Process API • JEP 102: Process API Updates • Новое: Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
  • 148. Обновление Process API • JEP 102: Process API Updates • Новое: • Получить pid “своей” JVM Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
  • 149. Обновление Process API • JEP 102: Process API Updates • Новое: • Получить pid “своей” JVM • Получить список процессов системы Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
  • 150. Обновление Process API • JEP 102: Process API Updates • Новое: • Получить pid “своей” JVM • Получить список процессов системы • Работа с деревьями процессов Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 40
  • 151. Обновление 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
  • 152. Обновление 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
  • 153. Обзор JEP-ов. Что уберут? 41
  • 154. Обзор JEP-ов. Что уберут? • 231: Remove Launch-Time JRE Version Selection 41
  • 155. Обзор JEP-ов. Что уберут? • 231: Remove Launch-Time JRE Version Selection • 240: Remove the JVM TI hprof Agent 41
  • 156. Обзор JEP-ов. Что уберут? • 231: Remove Launch-Time JRE Version Selection • 240: Remove the JVM TI hprof Agent • 241: Remove the jhat Tool
 
 ——————————— 41
  • 157. Обзор 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
  • 158. Обзор 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
  • 160. Обзор JEP-ов. Ключевые API • 261, 162, 200, 201, 220, 260, 261 Модули и модулярность. 42
  • 161. Обзор JEP-ов. Ключевые API • 261, 162, 200, 201, 220, 260, 261 Модули и модулярность. • 102: Process API Updates 42
  • 162. Обзор JEP-ов. Ключевые API • 261, 162, 200, 201, 220, 260, 261 Модули и модулярность. • 102: Process API Updates • 230: Microbenchmark Suite 42
  • 163. Обзор JEP-ов. Ключевые API • 261, 162, 200, 201, 220, 260, 261 Модули и модулярность. • 102: Process API Updates • 230: Microbenchmark Suite • 193: Variable Handles (?) 42
  • 164. Обзор JEP-ов. Ключевые API • 261, 162, 200, 201, 220, 260, 261 Модули и модулярность. • 102: Process API Updates • 230: Microbenchmark Suite • 193: Variable Handles (?) • 227: Unicode 7.0 42
  • 165. Обзор JEP-ов. Ключевые API • 261, 162, 200, 201, 220, 260, 261 Модули и модулярность. • 102: Process API Updates • 230: Microbenchmark Suite • 193: Variable Handles (?) • 227: Unicode 7.0 42
  • 166. Обзор 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
  • 167. Обзор 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
  • 168. Обзор 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
  • 170. Обзор JEP-ов. Графика • 258: HarfBuzz Font-Layout Engine 43
  • 171. Обзор JEP-ов. Графика • 258: HarfBuzz Font-Layout Engine • 263: HiDPI Graphics on Windows and Linux 43
  • 172. Обзор JEP-ов. Графика • 258: HarfBuzz Font-Layout Engine • 263: HiDPI Graphics on Windows and Linux • 265: Marlin Graphics Renderer 43
  • 173. Обзор JEP-ов. Графика • 258: HarfBuzz Font-Layout Engine • 263: HiDPI Graphics on Windows and Linux • 265: Marlin Graphics Renderer • 262: TIFF Image I/O 43
  • 174. Обзор 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
  • 175. Обзор 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
  • 178. Обзор JEP-ов. Производительность • 143: Improve Contended Locking • 266: More Concurrency Updates 44
  • 179. Обзор JEP-ов. Производительность • 143: Improve Contended Locking • 266: More Concurrency Updates • 197: Segmented Code Cache 44
  • 180. Обзор JEP-ов. Производительность • 143: Improve Contended Locking • 266: More Concurrency Updates • 197: Segmented Code Cache • 165: Compiler Control 44
  • 181. Обзор JEP-ов. Производительность • 143: Improve Contended Locking • 266: More Concurrency Updates • 197: Segmented Code Cache • 165: Compiler Control • 243: Java-Level JVM Compiler Interface 44
  • 182. Обзор 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
  • 183. Обзор 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
  • 184. Обзор 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
  • 186. Обзор 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
  • 188. Про 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
  • 189. Про 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
  • 191. Спасибо Время вопросов и ответов @JohnWings 48
  • 193. 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! }