Java была разработана в 1995 году компанией Sun Microsystems и изначально создавалась для интерактивного телевидения и программирования бытовых электронных устройств. Тем не менее, публичный релиз Java 1.0 выявил смену фокуса на интернет-использование, превратив его в один из самых популярных языков программирования.
Очевидно, со времен 1.0 многое изменилось и вот наконец после множества переносов 21 сентября 2017 года состоялся релиз Java 9.
Особенности предыдущей (8-й) версии благодаря своей универсальности предоставили разработчикам возможность создавать решения для самых разных секторов бизнеса, включая финтех, здравоохранение и другие индустрии. Среди ключевых нововведений Java 8 следует отметить лямбда-выражения, стримы и изменения в API.
В свою очередь Java 9 также изобилует разнообразием обновлений “под капотом” и в API. Кроме очевидного проекта Jigsaw, на который возложена обязанность по внедрению модулярности в основные компоненты Java, новая версия может похвастаться ещё тремя важными фичами:
- Полная поддержка клиента HTTP 2.0: Вопрос в скорости, и HTTP 2.0 предоставляет более высокие результаты, колеблющиеся от 11.81% до 47.7% по сравнении с клиентом HTTP 1.1.
- Jshell: Новый инструмент командной строки. Если разработчик хочет автономно запустить несколько строк Java, то это можно выполнить без необходимости заворачивать все в отдельный метод или проект.
- Microbenchmark: Теперь производительность отдельных небольших частей кода можно измерить стандартизированным методом. Анализ JMH за наносекунды уникален для Java 9.
С полным списком советуем ознакомиться на портале сообщества Java, а также свободно скачать дистрибутив для ознакомления.
Далее мы ближе рассмотрим несколько фич, отсутствовавших в Java 8.
HTTP/2 клиент
Это, пожалуй, самое ожидаемое нововведение — HTTP клиент с поддержкой как HTTP/2 протокола, так и WebSocket. Ведь SPDY протокол от Google, на базе которого основан HTTP/2 уже демонстрирует улучшенную производительность наравне с Netty или Jetty, поддержку неблокирующего режима (много потоков на запрос/ответ), а также Push-поддержку сервера, позволяющую отправлять ресурсы клиенту без явного запроса.
Новый API представлен как первый инкубаторный модуль для Java — экспериментальная фича, которая при должном развитии официально появится в следующей версии (то есть Java 10), либо будет удалена. Необычный концепт для Java, который поощряет эксперименты, но при этом не нарушает обратной совместимости.
Проект Jigsaw
Проект Jigsaw (в переводе “головоломка”) направлен на модуляризацию Java. Это значит, что программный код разбивается на части и организуется по модулям в зависимости от задач, которые эти модули выполняют. Это позволяет использовать модули повторно, упрощает их организацию и отладку. Что ведет к оптимизированной и отлаженной разработке ПО. Это ключевое отличие Java 9 от Java 8.
Второе большое преимущество — Java Platform становится легче и более масштабируемой. Это позволяет Java-приложениям работать даже на устройствах с низкой производительностью (так как для работы требуется меньше ресурсов). Это большое изменение особенно в контексте интернета вещей (IoT). Шаг вперед для Java, и шанс увидеть больше IoT-приложений, написанных на этом языке.
Jshell
Jshell добавит встроенную поддержку и популяризирует подход Java к REPL (Read-Eval-Print-Loop). Это интерактивный инструмент, позволяющий тестировать небольшие части кода без необходимости создавать новые классы. Он оснащен функциями истории и автозаполнения, а также рядом других особенностей, включая сохранение и загрузку написанных выражений.
Скажем, если захочется запустить несколько строк Java самостоятельно, то теперь не придется заворачивать их в отдельный проект или метод. Что касается точек с запятой — можно забыть про них: Существуют различные альтернативы наподобие плагинов REPL для популярных IDE или веб-консоли Java REPL, но ни одна из них не является официальной.
Унифицированное протоколирование JVM
Добавлена единая система протоколирования всех JVM-компонентов. Тем не менее, если мы посмотрим на плюсы и минусы Java 9, вот один из них. Вызовы протоколирования отдельных компонентов JVM отсутствуют, также как и протоколирование Java-кода в Java Development Kit
G1 — дефолтный сборщик мусора
Очень часто сталкиваемся с заблуждением, что в Java есть только один сборщик мусора, хотя по факту их 4. Parallel / Throughput Collector считался дефолтным в прошлых версиях, но теперь его заменил G1, который был представлен в Java 7 и был разработан для лучшей поддержки куч размером более 4GB. Он вызывает меньше GC пауз, но если они все же происходят, то длятся дольше.
Изображения с мульти-разрешением
Этот API позволяет инкапсулировать набор изображений с разными разрешениями в единый объект. Таким образом, разработчик может получить изображение с определенным разрешением или все варианты внутри одного.
Примечательные обновления API: Concurrency и Stack Walking
Java 9 получил обновление CompletableFuture и java.util.concurrent.Flow. Flow — это Java-реализация Reactive Streams API. Reactive Streams помогают решить проблему back-pressure — накопления большого количества данных, которое происходит, когда скорость получения входящих событий выше, чем скорость их обработки приложением, что приводит к появлению буферов необработанных данных. Кроме того, в рамках улучшения concurrency, CompletableFuture получил обновление, которое решило проблемы, выявленные после его внедрения в Java 8. Оно включает поддержку задержек и тайм-аутов, улучшенную поддержку подклассов и несколько полезных методов.
Также хочется упомянуть о Stack Walking API. Все верно, Java 9 меняет подход к работе со стек-трейсами, предоставляя официальный способ обработки стек-трейсов, вместо приравнивания их к простому тексту.
Immutable List, Set, Map, и Map.Entry API
Создание множеств из нескольких элементов в Java 8 требовало нескольких строк кода. Теперь это можно осуществить только одной. Таким образом, один из самых времязатратных недостатков Java 8 был устранен. Это должно облегчить работу с массивами и ускорить некоторые функции.
Преимущества Java 9
Детали отличий Java 9 от Java 8 представляют большой интерес для разработчиков, а следовательно и для бизнеса, находящегося в поиске наилучших решений. Нововведения девятой версии улучшают следующие аспекты разработки:
- Скорость выше благодаря поддержке клиента HTTP/2.
- Приложения становятся ресурсоэффективней, потому что разработчики могут использовать только необходимые модули, а не всю JRE.
- Разработка ускоряется благодаря системе модулей, позволяющей их повторное использование, упрощенную отладку и управление.
- Появляется возможность анализа производительности очень маленьких частей кода благодаря Microbenchmarks.
- Множества создаются одной строчкой кода.
THE END
Вот такая выжимка всех интересных изменений, которые мы отметили после выхода новой версии. Правда, теперь главный вопрос в том, когда компании начнут внедрять её, учитывая, что встречаются такие, кто ещё и восьмую версию не использует. В итоге пока решили не менять программу курса (не считая мелкой косметики) и оставить всё как есть, а уже в следующем году задуматься насчёт этого.
Комментарии (45)
TheKnight
27.10.2017 03:41Благодарю за статью!
А можно рассказать о причинах перевода термина " logging" как протоколирование?
P.S.: Пишу не в личку, поскольку считаю причины выбора такого перевода полезными не только для меня.flatscode
27.10.2017 06:11А можно рассказать о причинах перевода термина " logging" как протоколирование?
А у вас какие предпочтения? Регистрация? Журналирование?
Для этих двух вариантов есть омонимы, которые вспоминаются сходу.
А для «протоколирование» я омонима даже и не вспомню.
MaxRokatansky Автор
27.10.2017 13:02Хм. Внезапный вопрос… Вообще просто чаще используется в работе, поэтому привычнее протоколирование, чем, например, прямая транслитерация.
ad1Dima
27.10.2017 07:01Сначала прочитал Jshell как JS Hell, а не J Shell…
SlavniyTeo
27.10.2017 09:46Плюсанул бы, если б мог.
Отличное название, я считаю.
И так недостаточно людей в околопрограммистской тусовке путают Java и JavaScript.
Ilya81
27.10.2017 10:08Всё б хорошо, да только я так понимаю пользовательских value type так и нет? В Swift они есть. Я всегда предпочитал C# во многом из-за этого, но что мне не нравилось, что там константы возможны лишь для предопределённых типов. Ещё не совсем освоил Swift, особенно новинки 4-го, но, там, кажется со всеми этими моментами порядок. Java по мне определённо хорош классическим синтаксисом, а в C# зато обработка исключений сделана мягко говоря не лучшим образом, но в плане возможностей на фоне Swift 4 по мне это меркнет.
Хотя, кажется, появляются ещё какие-то языки программирования, что я ещё освоить не успел. У понравившегося мне в своё время D чувствую шансов прижиться уже немного, но, впечатление, что улучшенные варианты уже есть. Вот только упомянутое в начале ограничение, насколько я понимаю, относится ко всему JVM.grossws
27.10.2017 19:30У D вылезти на большую арену шансов уже очень мало. Особенно учитывая, что он не смог это сделать за полторы декады.
solver
27.10.2017 10:51Особенности предыдущей (8-й) версии благодаря своей универсальности предоставили разработчикам возможность создавать решения для самых разных секторов бизнеса, включая финтех, здравоохранение и другие индустрии.
Т.е. вы это на полном серьезе утверждаете? Что только Java 8-й версии «предоставила разработчикам возможность создавать решения для самых разных секторов бизнеса, включая финтех, здравоохранение и другие индустрии.»? FacePalm… Маркетологи погубят этот мир…
kovserg
27.10.2017 12:50+1Можно ли запустить java9 на windows xp?
SMAX1
27.10.2017 14:17Я слышал, что с выходом Java 9 появится AOT-компиляция. Она в итоге появилась или я что-то напутал?
MaxRokatansky Автор
27.10.2017 18:08Ahead Of Time Compilation (AOT) openjdk.java.net/jeps/295 действительно попала в java9, и доступна сейчас в OpenJDK jdk.java.net/9
Это статическая компиляция java кода в нативный
В последней сборке Oracle JDK (9.0.1) AOT отсутствует
Утилита называется jaotc
kovserg
27.10.2017 14:42Еще о новшествах: где скачать Java9 JDK для 32bit windows?
d_ilyich
27.10.2017 17:12+1Официально, вероятно, нигде.
kovserg
27.10.2017 17:20И под ARM-ы не будет?
grossws
27.10.2017 19:32Вполне возможно, что будет. 8u151 есть под arm (и aarch32 и aarch64): http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
dasFlug
27.10.2017 17:12+1Официального 32bit JDK нет. Можно попробовать собрать самому как советует Марк Рейнхольд.
gricom
27.10.2017 16:10Для кого эта статья? Если для программистов, то неплохо было бы привести примеры кода «до» и «после».
MaxRokatansky Автор
27.10.2017 17:17-1Это обобщённая статья для всех и, разумеется, не последняя. В следующих как раз рассмотрим практические примеры по разным аспектам
solver
30.10.2017 11:29>и, разумеется, не последняя
Надеюсь последующие статьи будут писать не маркетологи, а технари…
grossws
27.10.2017 19:25G1, который был представлен в Java 7 и был разработан для лучшей поддержки куч размером более 4GB. Он вызывает меньше GC пауз, но если они все же происходят, то длятся дольше.
ШТА?! G1 старается держать паузы предсказуемыми и их может быть больше или меньше в зависимости от параметра
MaxGCPauseMillis
. И эти паузы могут быть запросто меньше, чем в старых gc типа CMS. G1 на основе предыдущих сборок оценивает сколько регионов он сможет обработать при очередной сборке.grossws
27.10.2017 19:35Стоит добавить, что чисто маркетоидное "http/2 быстрее" очень спорно. Особенно, если не уточнить в каком смысле и при каких условиях. Там в первую очередь интересна экономия сокетов, мультиплексирование, приоритизация мультиплексированных потоков, потенциальное уменьшение latency и server push.
MaxRokatansky Автор
27.10.2017 19:41http/2 у нас как раз в первую очередь пойдёт на отдельную заметку и практику. Так что там будет более подробно это раскрыто.
В рамках такой сравнительной статьи, разумеется, не хватает глубины по каждому пункту, но это поправим в следующих выпусках.grossws
27.10.2017 19:43Это, извините, выглядит не как "не хватает глубины по каждому пункту", а как вопиющая некомпетентность. Как с тем же G1GC.
mrobespierre
«Jigsaw» — обычно означает пазлы, но здесь, скорее всего, имеет место второе значение — лобзик (пила), из-за разделения на части. Релиз, кажется, на год задержали или больше?
ad1Dima
Как раз элементами пазлов обычно и представляют модули. Так что пазл — самое то.
EreminD
Но ведь только лобзиком можно что-то запилить или выпилить
ad1Dima
поэтому головоломка и называется Jigsaw puzzle — распиленная головоломка.
mrobespierre
в том то и дело, что речь не о самих модулях, а о процессе разделения платформы на части
ad1Dima
ну тогда это слово стоит воспринимать как глагол: лобзикование.
MaxRokatansky Автор
Вот да :) Всё-таки чисто лобзик — достаточно многогранная штука.
kalininmr
ну почемуже.
именно пазлы имеется в виду.
разбиение на кусочки.
ИМХО
MaxRokatansky Автор
Пазл тут вполне себе в тему, т.к. как раз разделено уже на части и больше отражает суть, чем лобзик. Лично у меня лобзик вообще ассоциируется с уроками труда, а отнюдь не с разделением на части.
Чуть больше года, насколько я помню. Переносы с прошлого лета пошли.