SlideShare une entreprise Scribd logo
1  sur  195
Télécharger pour lire hors ligne
Чего ждать от 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

Contenu connexe

Tendances

Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?Верификация Java байткода: когда, как, а может отключить?
Верификация Java байткода: когда, как, а может отключить?
Nikita Lipsky
 
Maven 3 : уличная магия
Maven 3 : уличная магияMaven 3 : уличная магия
Maven 3 : уличная магия
Aleksey Solntsev
 
Client Side Autotesting Flash
Client Side Autotesting FlashClient Side Autotesting Flash
Client Side Autotesting Flash
guestb0af15
 

Tendances (20)

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

Similaire à What to expect from Java 9

Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
Dmitry Buzdin
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
Alex Chistyakov
 
[jeeconf-2011] Java Platform Performance BoF
[jeeconf-2011] Java Platform Performance BoF[jeeconf-2011] Java Platform Performance BoF
[jeeconf-2011] Java Platform Performance BoF
Aleksey Shipilev
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU
 
AOT-компиляция Java
AOT-компиляция JavaAOT-компиляция Java
AOT-компиляция Java
Tech Talks @NSU
 

Similaire à What to expect from Java 9 (20)

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

Plus de JavaDayUA

Plus de JavaDayUA (20)

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