SlideShare a Scribd company logo
1 of 52
Download to read offline
Java 9 - не только модули
Иван Крылов

1
@JohnWings
ivankrylov.java@gmail.com
О чем будем говорить
• Два слайда про нас (Azul Systems)

• Изменения в языке

• Новые фабричные методы для
коллекций

• Новое в Stream API

• Spin Loop Hints

• Process API

• HTTP/2 

• JVM changes

• Stack Walking API

• Обзор прочих JEPов

• JShell
2
Ivan Krylov
Zing: Виртуальная Java-машина для крупного бизнеса
• Главная цель - улучшение показателей функционирования виртуальной
Java-машины для предприятий
• Новый JIT компилятор на базе LLVM
• Сборка мусора больше не влияет на производительность приложений
• Решенная проблема "прогрева" ВМки
• Неизменная производительность - не просто быстро, а ВСЕГДА быстро
• Широчайшая сфера применения:
• от интерактивных приложений до задач, критичных ко времени отклика
• от микросервисов до приложений, требующих больших объемов памяти
• Устраняет необходимость в большинстве известных "костылей" в вашем
коде
3
Zulu (Embedded): Когда нужны решения для встроенных систем
• 100% открытый код - технология, основанная на OpenJDK
• Сертифицирована на совместимость и соответствие Java SE
• Показатели функционирования, идентичные OpenJDK и
Oracle Java SE
• Высококлассная поддержка
• Релизация для Linux x86, ARM32, ARM64, PPC32, MIPS, а
также Windows и Mac OS
4
Ориентировочное
расписание выхода Java 9Featurecomplete
ZeroBugBounce
Rampdownphase2
FinalReleaseCandidate
Май’16
RampdownStartAllTestsRun
GeneralAvailability
Янв’17
Фев’17
Фев’17
Март’17
Июль’17
27Июля’17
5
Ext.Featurecomplete
Дек’16
6
Голосование по JSR #376
7
9
interface I {
private I foo() { return null; } // OK.
void foo(int x); // OK.
private void foo(String s); 

// Error: private method must declare body.
private abstract void foo(int i, int j);
// Error: private & abstract: bad combo.
}
Приватные методы в интерфейсах
Приватные методы в интерфейсах
13
public interface II {
private void log(int x, int y, int z) {
System.out.println("x="+x+" y="+y+" z="+z);
}
default int sum(int x, int y) {
log(x,y,x+y);
return x+y;
}
default int mul(int x, int y) {
log(x,y,x*y);
return x*y;
}
}
Effectively-final переменные 

в try-with-resources выражениях
14
public static void main(String... args) {
FileReader f = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
try (br) {
// do something
} catch (Exception ex) {
}
}
public static void main(String... args) {
FileReader f = new FileReader(“test.txt");
try (br = new BufferedReader(fr)) {
// do something
} catch (Exception ex) {
}
}
Использование @SafeVarargs

в private методах
15
class VarargsFinalOnly {
@SafeVarargs void m(List<String>... args) { }
}
В Java 8
./TypeInferrenceTest.java:7: error: cannot infer
type arguments for HashMap<K,V>
new HashMap<>()
^
reason: cannot use '<>' with anonymous inner classes
where K,V are type-variables:
K extends Object declared in class HashMap
V extends Object declared in class HashMap
1 error
Diamond с анонимными классами
16
class TypeInferrenceTest {
Map<String, String> map =
new HashMap<> ()
{
{
map.put("key", "value");
}
};
}
Запрет на использование _ в именах
17
// -source 8:
// warning: as of release 9, '_' is a keyword,
// and may not be used as an identifier
// -source 9:
// error: as of release 9, '_' is a keyword,
// and may not be used as an identifier
class UnderscoreAsIdentifierWarning {
String _ = null;
}
Другие обновления языка (?)
Надоело писать имя типа в декларации переменной?
18
var list = new ArrayList<String>();
JEP-286 Local-Variable Type Inference. Пока что только “кандидат”
var result = processNewCustomerAdded();
Фабричные методы для коллекций
Создание неизменных контейнеров
19
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set = Collections.unmodifiableSet(set);
Set<String> set = Collections.unmodifiableSet(
new HashSet<>(Arrays.asList("a", "b")));
Set<String> set = Collections.unmodifiableSet(
new HashSet<String>() {{
add("a");
add("b");
}});
Set<String> set = Collections.unmodifiableSet(
Stream.of("a", “b").collect(toSet())
);
Set<String> set = Set.of("a", "b");
Фабричные методы для коллекций
20
• Set.of(a, b);
• List.of(a, b);
• Map.of(k1, v1);
• Map.of(k1, v1, k2, v2);
• Map.of(k1, v1, k2, v2, k3, v3);
• Map.ofEntries(entry(k1, v1), entry(k2, v2), ….. entry (kn, vn));
Новое в Stream API (1)
22
Stream::takeWhile
while (predicate_on_stream_element) { 

<keep processing this ordered stream>

};
Stream.of(3, 2, 1, 0, -1, 0, 1, 2, 3)
.takeWhile(s -> s > 0)
.forEach(System.out::println);
3
2
1
Новое в Stream API (2)
23
Stream::dropWhile
while (predicate_on_stream_element) {

<skip element of this ordered stream>

};
Stream.of(3, 2, 1, 0, -1, 0, 1, 2, 3)
.dropWhile(s -> s > 0)
.forEach(System.out::println);
0
-1
0
1
2
3
Новое в Stream API (3)
24
• Stream::Iterate с предикатом
Stream.iterate(3, i -> i > 0, i -> i-1)
.forEach(System.out::println);
3
2
1
версия для Java 8:

Stream.iterate(3, i -> i-1)
.limit(3)
.forEach(System.out::println);
Stream API changes (4)
25
Stream::ofNullable
Фактори для одного ненулевого элемента
long a = Stream.ofNullable(1).count();
long b = Stream.ofNullable(null).count();
System.out.println(a);
System.out.println(b);
1
0
Spin Loop Hint (JEP-285)
• Цель: latency (и производительность)
• Весь API:

• Метод j.l.Thread.onSpinWait()
• На x86 используется инструкция ‘pause’
• Используется в JSR 166 для JDK9

• java/util/concurrent/locks/StampedLock.java

• java/util/concurrent/Phaser.java

• java/util/concurrent/SynchronousQueue.java
class EventHandler {
volatile boolean eventNotificationNotReceived;
void waitForEventAndHandleIt() {
while ( eventNotificationNotReceived ) {
java.lang.Thread.onSpinWait();
}
readAndProcessEvent();
}
void readAndProcessEvent() {
// Read event from some source and process it
. . .
}
}
26
Producer/Consumer and SLH
27
Поддержка SLH в Idea
28
Spin Loop Hint - source level
совместимость
• Допустим, есть код, собирающийся 8-кой 

• Используйте Agrona library

• или подсмотрите в java/org/agrona/hints/ThreadHints.java 

• Поддержка, начиная с Java 7
29
https://github.com/real-logic/Agrona/blob/master/src/main/java/org/agrona/hints/ThreadHints.java
Код для разных версий Java
• Писать все только под самый старый javaс

• Разные артифакты

• “Толстые” jar архивы (начиная с 9)
Multi-Release JARs (JEP-238)
31
…
Код для JRE версии меньше 9
Код для JRE версии 9
Код для JRE версии 10
MANIFEST.MF: Multi-Release: true

<root>/META-INF/versions/ ..
• https://github.com/ivankrylov/onSpinWaitMultiReleaseJar

• onSpinWait Wrapper

• javac + make 

• http://in.relation.to/2017/02/13/building-multi-release-jars-with-maven/

• Get pid of jvm

• Maven Antrun + resources + maven-jar-plugin

• http://word-bits.flurg.com/multrelease-jars/
Примеры Multi-Release JARs
32
Garbage First включен по умолчанию
• Самый современный GC в Hotspot

• Региональный параллельный одновременный коллектор

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

• По умолчанию => Ошибки в GC находятся быстрее
33
Garbage First включен по умолчанию
• Эргономика работает по-другому. Могут
проявиться ошибки в синхронизации
• Были (есть(?)) несовместимости с G1 в Cassandra,
Elasticsearch, Lucene, и т.п,.
• (июль 2015): https://groups.google.com/forum/#!topic/
mechanical-sympathy/JxsuVtIIOaY
34
Пережить смену default GC, не теряя сон
• Если до сих пор вас устраивали настройки GC по
умолчанию 

• запаситесь данными эргономики для вашего приложения и
среды внедрения (-XX:+PrintFlagsFinal)

• пропишите их в деплоймент скриптах
• Если вы и ранее явно выбирали GC и флаги GC

• Ничего не изменится, старые коллекторы не исчезнут
• Тестируйте с G1. Не дожидаясь Java 9.
35
Хороший повод узнать побольше про GC
• Экспериментируйте с G1

• Главное - понимать основные принципы работы GC

• Прежде всего - метрики, которыми оценивают алгоритмы GC

• Что еще почитать: http://www.infoq.com/minibooks/java-garbage-
collection
36
Другие изменения в GC
• Deprecate CMS

• Deprecate - значит запретить, но в будущем (после 9ки)

• Shenandoah GC (JEP-189)

• Первый OpenJDK GC не от Оракла

• Создание GC интерфейса

• https://bugs.openjdk.java.net/browse/JDK-8163329
37
Обновление Process API
• JEP 102: Process API Updates

• Новое:

• Получить pid “своей” JVM

• Получить список процессов
системы

• Работа с деревьями процессов

• supportsNormalTermination() ? 

Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 38
Пример Process API
Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 39
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
Унификация JVM/GC логгинга
• Унификация по всем подсистемам jvm

• 6 уровней + тэги 

• Вывод в stdout / stderr / файл / зацикленный файл 

• Побороли проблему некорректного вывода логов

• 11 декораторов
java -Xlog:help
41
Смена логгинг опций
-Xlog:classinit
-Xlog:classloaderdata
-Xlog:defaultmethods
-Xlog:itables
-Xlog:monitormismatch
-Xlog:safepoint
-Xlog:startuptime
-Xlog:vmoperation
-Xlog:vtables
-Xlog:verification
...
-XX:+TraceClassInitialization
-XX:+TraceClassLoaderData
-XX:+TraceDefaultMethods
-XX:+TraceItables
-XX:+TraceMonitorMismatch
-XX:+TraceSafepoint
-XX:+TraceStartupTime
-XX:+TraceVMOperation
-XX:+PrintVtables
-XX:+VerboseVerification
...
42
Но не все опции ушли
-XX:+PrintDeoptimizationDetails
-XX:+PrintAOT
-XX:+ThreadPriorityVerbose
-XX:+PrintTieredEvents
-XX:+PrintConcurrentLocks
-XX:+PrintSharedSpaces
-XX:+PrintSharedArchiveAndExit
-XX:+PrintSharedDictionary
-XX:+PrintMethodHandleStubs
-XX:+PrintVMQWaitTime
...
HTTP/2 сегодня
43
HTTP -> TCP
44
• HTTP 0.9: The One-Line Protocol (1989)

• HTTP/1.0 (1996)

• HTTP/1.1: Internet Standard (1997)

• Keep alive; chunk encodings; byte-
range requests, additional caching
mechanisms, transfer encodings, and
request pipelining

• HTTP/2.0 (since 2012)
Ref: https://hpbn.co/brief-history-of-http/
45
https://speakerdeck.com/vietj/2-2
HTTP/2. Multiplexing
• 227: Unicode 7.0…
• … & 267: Unicode 8.0
Unicode в Java 9
46
Обзор 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
53
Stack walking API
• Было: Throwable::getStackTrace и Thread::getStackTrace

StackTraceElement[] stack = Thread.currentThread().getStackTrace();
• Стало:

StackFrame[] stack =new StackWalker().walk((s) ->
s.collect(Collectors.toArray()));
• Новый класс StackWalker
54
Обзор JEP-ов.
Производительность
197: Segmented Code Cache
165: Compiler Control

295: Ahead-of-Time Compilation

243: Java-Level JVM Compiler
Interface 

246: Leverage CPU Instructions for
GHASH and RSA

254: Compact Strings

280: Indify String Concatenation

250: Store Interned Strings in CDS
Archives

143: Improve Contended Locking

266: More Concurrency Updates
56
Обзор 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
64
Обзор JEP-ов. Что уберут?
• 231: Remove Launch-Time JRE
Version Selection
• 240: Remove the JVM TI hprof
Agent
• 241: Remove the jhat Tool
65
• Последствия
модулярности (JEP - 261)

• -Xbootclasspath
• -Xbootclasspath/p
• system property
sun.boot.class.path
JShell
• Развива(ется/лся) в рамках
проекта Kulla 

• Позволяет попробовать
синтаксис без написания
законченной программы

• Помогает обучать языку Java
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
66
?

jdk9/bin/jshell

67
Jshell Demo
68
Jshell use cases
Currency API (JSR-354)
Не войдет в Java 9, развивается отдельно
69
Спасибо

Время вопросов
и ответов
@JohnWings
70
@
Deprecate finalize
• Deprecate Object.finalize with forRemoval=false
• Problem - object’s “resurrection“
• Alternatives
• PhantomReference
• java.lang.ref.Cleaner (since 9)
• https://stuartmarks.wordpress.com/2017/04/17/deprecation-of-object-
finalize/
71

More Related Content

What's hot

Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - BytecodeAnton Arhipov
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Anton Arhipov
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыYandex
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitByndyusoft
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверPlatonov Sergey
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияSQALab
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Oleksii Okhrymenko
 
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency InjectionPlatonov Sergey
 
Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевYandex
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Oleksii Okhrymenko
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияMatvey Malkov
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаJPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаAnton Arhipov
 
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Ontico
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Yulia Tsisyk
 
Continuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedAleksandr Tarasov
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Magneta AI
 

What's hot (20)

Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - Bytecode
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/await
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестирования
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency Injection
 
Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр Кошелев
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложения
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаJPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчика
 
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
 
Continuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons Learned
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
Scala On Rest
Scala On RestScala On Rest
Scala On Rest
 

Similar to Java 9: what is there beyond modularization

Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозитElena Kotina
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...Nikolay Samokhvalov
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended versionIvan Krylov
 
Jiramania презентации @augspb
Jiramania презентации   @augspbJiramania презентации   @augspb
Jiramania презентации @augspbGonchik Tsymzhitov
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаMikhail Chinkov
 
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...Darya Zubova
 
Тестируем legacy c++
Тестируем legacy c++Тестируем legacy c++
Тестируем legacy c++Maxim Shulga
 
Процессы разработки в Яндексе
Процессы разработки в ЯндексеПроцессы разработки в Яндексе
Процессы разработки в ЯндексеAndrey Kazarinov
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandexaviatakz
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1Technopark
 
Александр Баяндин
Александр БаяндинАлександр Баяндин
Александр БаяндинCodeFest
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, ParallelsNikolay Samokhvalov
 

Similar to Java 9: what is there beyond modularization (20)

Java 9 - кратко о новом
Java 9 -  кратко о новомJava 9 -  кратко о новом
Java 9 - кратко о новом
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
 
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
Jiramania презентации @augspb
Jiramania презентации   @augspbJiramania презентации   @augspb
Jiramania презентации @augspb
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Java 9 - Back to the Future
Java 9 - Back to the FutureJava 9 - Back to the Future
Java 9 - Back to the Future
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
Гареев Роман, Создание генератора промежуточного представления Ssa из полиэдр...
 
Тестируем legacy c++
Тестируем legacy c++Тестируем legacy c++
Тестируем legacy c++
 
Процессы разработки в Яндексе
Процессы разработки в ЯндексеПроцессы разработки в Яндексе
Процессы разработки в Яндексе
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandex
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Александр Баяндин
Александр БаяндинАлександр Баяндин
Александр Баяндин
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 

Java 9: what is there beyond modularization

  • 1. Java 9 - не только модули Иван Крылов 1 @JohnWings ivankrylov.java@gmail.com
  • 2. О чем будем говорить • Два слайда про нас (Azul Systems) • Изменения в языке • Новые фабричные методы для коллекций • Новое в Stream API • Spin Loop Hints • Process API • HTTP/2 • JVM changes • Stack Walking API • Обзор прочих JEPов • JShell 2 Ivan Krylov
  • 3. Zing: Виртуальная Java-машина для крупного бизнеса • Главная цель - улучшение показателей функционирования виртуальной Java-машины для предприятий • Новый JIT компилятор на базе LLVM • Сборка мусора больше не влияет на производительность приложений • Решенная проблема "прогрева" ВМки • Неизменная производительность - не просто быстро, а ВСЕГДА быстро • Широчайшая сфера применения: • от интерактивных приложений до задач, критичных ко времени отклика • от микросервисов до приложений, требующих больших объемов памяти • Устраняет необходимость в большинстве известных "костылей" в вашем коде 3
  • 4. Zulu (Embedded): Когда нужны решения для встроенных систем • 100% открытый код - технология, основанная на OpenJDK • Сертифицирована на совместимость и соответствие Java SE • Показатели функционирования, идентичные OpenJDK и Oracle Java SE • Высококлассная поддержка • Релизация для Linux x86, ARM32, ARM64, PPC32, MIPS, а также Windows и Mac OS 4
  • 5. Ориентировочное расписание выхода Java 9Featurecomplete ZeroBugBounce Rampdownphase2 FinalReleaseCandidate Май’16 RampdownStartAllTestsRun GeneralAvailability Янв’17 Фев’17 Фев’17 Март’17 Июль’17 27Июля’17 5 Ext.Featurecomplete Дек’16
  • 7. 7
  • 8. 9 interface I { private I foo() { return null; } // OK. void foo(int x); // OK. private void foo(String s); 
 // Error: private method must declare body. private abstract void foo(int i, int j); // Error: private & abstract: bad combo. } Приватные методы в интерфейсах
  • 9. Приватные методы в интерфейсах 13 public interface II { private void log(int x, int y, int z) { System.out.println("x="+x+" y="+y+" z="+z); } default int sum(int x, int y) { log(x,y,x+y); return x+y; } default int mul(int x, int y) { log(x,y,x*y); return x*y; } }
  • 10. Effectively-final переменные 
 в try-with-resources выражениях 14 public static void main(String... args) { FileReader f = new FileReader("test.txt"); BufferedReader br = new BufferedReader(fr); try (br) { // do something } catch (Exception ex) { } } public static void main(String... args) { FileReader f = new FileReader(“test.txt"); try (br = new BufferedReader(fr)) { // do something } catch (Exception ex) { } }
  • 11. Использование @SafeVarargs
 в private методах 15 class VarargsFinalOnly { @SafeVarargs void m(List<String>... args) { } }
  • 12. В Java 8 ./TypeInferrenceTest.java:7: error: cannot infer type arguments for HashMap<K,V> new HashMap<>() ^ reason: cannot use '<>' with anonymous inner classes where K,V are type-variables: K extends Object declared in class HashMap V extends Object declared in class HashMap 1 error Diamond с анонимными классами 16 class TypeInferrenceTest { Map<String, String> map = new HashMap<> () { { map.put("key", "value"); } }; }
  • 13. Запрет на использование _ в именах 17 // -source 8: // warning: as of release 9, '_' is a keyword, // and may not be used as an identifier // -source 9: // error: as of release 9, '_' is a keyword, // and may not be used as an identifier class UnderscoreAsIdentifierWarning { String _ = null; }
  • 14. Другие обновления языка (?) Надоело писать имя типа в декларации переменной? 18 var list = new ArrayList<String>(); JEP-286 Local-Variable Type Inference. Пока что только “кандидат” var result = processNewCustomerAdded();
  • 15. Фабричные методы для коллекций Создание неизменных контейнеров 19 Set<String> set = new HashSet<>(); set.add("a"); set.add("b"); set = Collections.unmodifiableSet(set); Set<String> set = Collections.unmodifiableSet( new HashSet<>(Arrays.asList("a", "b"))); Set<String> set = Collections.unmodifiableSet( new HashSet<String>() {{ add("a"); add("b"); }}); Set<String> set = Collections.unmodifiableSet( Stream.of("a", “b").collect(toSet()) ); Set<String> set = Set.of("a", "b");
  • 16. Фабричные методы для коллекций 20 • Set.of(a, b); • List.of(a, b); • Map.of(k1, v1); • Map.of(k1, v1, k2, v2); • Map.of(k1, v1, k2, v2, k3, v3); • Map.ofEntries(entry(k1, v1), entry(k2, v2), ….. entry (kn, vn));
  • 17. Новое в Stream API (1) 22 Stream::takeWhile while (predicate_on_stream_element) { 
 <keep processing this ordered stream>
 }; Stream.of(3, 2, 1, 0, -1, 0, 1, 2, 3) .takeWhile(s -> s > 0) .forEach(System.out::println); 3 2 1
  • 18. Новое в Stream API (2) 23 Stream::dropWhile while (predicate_on_stream_element) {
 <skip element of this ordered stream>
 }; Stream.of(3, 2, 1, 0, -1, 0, 1, 2, 3) .dropWhile(s -> s > 0) .forEach(System.out::println); 0 -1 0 1 2 3
  • 19. Новое в Stream API (3) 24 • Stream::Iterate с предикатом Stream.iterate(3, i -> i > 0, i -> i-1) .forEach(System.out::println); 3 2 1 версия для Java 8:
 Stream.iterate(3, i -> i-1) .limit(3) .forEach(System.out::println);
  • 20. Stream API changes (4) 25 Stream::ofNullable Фактори для одного ненулевого элемента long a = Stream.ofNullable(1).count(); long b = Stream.ofNullable(null).count(); System.out.println(a); System.out.println(b); 1 0
  • 21. Spin Loop Hint (JEP-285) • Цель: latency (и производительность) • Весь API: • Метод j.l.Thread.onSpinWait() • На x86 используется инструкция ‘pause’ • Используется в JSR 166 для JDK9 • java/util/concurrent/locks/StampedLock.java • java/util/concurrent/Phaser.java • java/util/concurrent/SynchronousQueue.java class EventHandler { volatile boolean eventNotificationNotReceived; void waitForEventAndHandleIt() { while ( eventNotificationNotReceived ) { java.lang.Thread.onSpinWait(); } readAndProcessEvent(); } void readAndProcessEvent() { // Read event from some source and process it . . . } } 26
  • 24. Spin Loop Hint - source level совместимость • Допустим, есть код, собирающийся 8-кой • Используйте Agrona library • или подсмотрите в java/org/agrona/hints/ThreadHints.java • Поддержка, начиная с Java 7 29 https://github.com/real-logic/Agrona/blob/master/src/main/java/org/agrona/hints/ThreadHints.java
  • 25. Код для разных версий Java • Писать все только под самый старый javaс • Разные артифакты • “Толстые” jar архивы (начиная с 9)
  • 26. Multi-Release JARs (JEP-238) 31 … Код для JRE версии меньше 9 Код для JRE версии 9 Код для JRE версии 10 MANIFEST.MF: Multi-Release: true
 <root>/META-INF/versions/ ..
  • 27. • https://github.com/ivankrylov/onSpinWaitMultiReleaseJar • onSpinWait Wrapper • javac + make • http://in.relation.to/2017/02/13/building-multi-release-jars-with-maven/ • Get pid of jvm • Maven Antrun + resources + maven-jar-plugin • http://word-bits.flurg.com/multrelease-jars/ Примеры Multi-Release JARs 32
  • 28. Garbage First включен по умолчанию • Самый современный GC в Hotspot • Региональный параллельный одновременный коллектор • Предсказуемые паузы и высокая производительность! • По умолчанию => Ошибки в GC находятся быстрее 33
  • 29. Garbage First включен по умолчанию • Эргономика работает по-другому. Могут проявиться ошибки в синхронизации • Были (есть(?)) несовместимости с G1 в Cassandra, Elasticsearch, Lucene, и т.п,. • (июль 2015): https://groups.google.com/forum/#!topic/ mechanical-sympathy/JxsuVtIIOaY 34
  • 30. Пережить смену default GC, не теряя сон • Если до сих пор вас устраивали настройки GC по умолчанию • запаситесь данными эргономики для вашего приложения и среды внедрения (-XX:+PrintFlagsFinal) • пропишите их в деплоймент скриптах • Если вы и ранее явно выбирали GC и флаги GC • Ничего не изменится, старые коллекторы не исчезнут • Тестируйте с G1. Не дожидаясь Java 9. 35
  • 31. Хороший повод узнать побольше про GC • Экспериментируйте с G1 • Главное - понимать основные принципы работы GC • Прежде всего - метрики, которыми оценивают алгоритмы GC • Что еще почитать: http://www.infoq.com/minibooks/java-garbage- collection 36
  • 32. Другие изменения в GC • Deprecate CMS • Deprecate - значит запретить, но в будущем (после 9ки) • Shenandoah GC (JEP-189) • Первый OpenJDK GC не от Оракла • Создание GC интерфейса • https://bugs.openjdk.java.net/browse/JDK-8163329 37
  • 33. Обновление Process API • JEP 102: Process API Updates • Новое: • Получить pid “своей” JVM • Получить список процессов системы • Работа с деревьями процессов • supportsNormalTermination() ? 
 Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 38
  • 34. Пример Process API Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/ 39 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());
  • 35. 40 Унификация JVM/GC логгинга • Унификация по всем подсистемам jvm • 6 уровней + тэги • Вывод в stdout / stderr / файл / зацикленный файл • Побороли проблему некорректного вывода логов • 11 декораторов java -Xlog:help
  • 37. 42 Но не все опции ушли -XX:+PrintDeoptimizationDetails -XX:+PrintAOT -XX:+ThreadPriorityVerbose -XX:+PrintTieredEvents -XX:+PrintConcurrentLocks -XX:+PrintSharedSpaces -XX:+PrintSharedArchiveAndExit -XX:+PrintSharedDictionary -XX:+PrintMethodHandleStubs -XX:+PrintVMQWaitTime ...
  • 39. HTTP -> TCP 44 • HTTP 0.9: The One-Line Protocol (1989) • HTTP/1.0 (1996) • HTTP/1.1: Internet Standard (1997) • Keep alive; chunk encodings; byte- range requests, additional caching mechanisms, transfer encodings, and request pipelining • HTTP/2.0 (since 2012) Ref: https://hpbn.co/brief-history-of-http/
  • 41. • 227: Unicode 7.0… • … & 267: Unicode 8.0 Unicode в Java 9 46
  • 42. Обзор 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 53
  • 43. Stack walking API • Было: Throwable::getStackTrace и Thread::getStackTrace StackTraceElement[] stack = Thread.currentThread().getStackTrace(); • Стало: StackFrame[] stack =new StackWalker().walk((s) -> s.collect(Collectors.toArray())); • Новый класс StackWalker 54
  • 44. Обзор JEP-ов. Производительность 197: Segmented Code Cache 165: Compiler Control 295: Ahead-of-Time Compilation 243: Java-Level JVM Compiler Interface 246: Leverage CPU Instructions for GHASH and RSA 254: Compact Strings 280: Indify String Concatenation 250: Store Interned Strings in CDS Archives 143: Improve Contended Locking 266: More Concurrency Updates 56
  • 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 64
  • 46. Обзор JEP-ов. Что уберут? • 231: Remove Launch-Time JRE Version Selection • 240: Remove the JVM TI hprof Agent • 241: Remove the jhat Tool 65 • Последствия модулярности (JEP - 261) • -Xbootclasspath • -Xbootclasspath/p • system property sun.boot.class.path
  • 47. JShell • Развива(ется/лся) в рамках проекта Kulla • Позволяет попробовать синтаксис без написания законченной программы • Помогает обучать языку Java class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } 66
  • 50. Currency API (JSR-354) Не войдет в Java 9, развивается отдельно 69
  • 52. Deprecate finalize • Deprecate Object.finalize with forRemoval=false • Problem - object’s “resurrection“ • Alternatives • PhantomReference • java.lang.ref.Cleaner (since 9) • https://stuartmarks.wordpress.com/2017/04/17/deprecation-of-object- finalize/ 71