Java — удивительно универсальный язык программирования. На сегодняшний день насчитывается около 6.5 млн разработчиков Java по всему миру. И все благодаря его утилитарности, простоте использования, безопасности и независимости платформы (он работает вне зависимости от того, какое оборудование или операционная система используются).

Java была разработана в 1995 году компанией Sun Microsystems и изначально создавалась для интерактивного телевидения и программирования бытовых электронных устройств. Тем не менее, публичный релиз Java 1.0 выявил смену фокуса на интернет-использование, превратив его в один из самых популярных языков программирования.

Очевидно, со времен 1.0 многое изменилось и вот наконец после множества переносов 21 сентября 2017 года состоялся релиз Java 9.

Особенности предыдущей (8-й) версии благодаря своей универсальности предоставили разработчикам возможность создавать решения для самых разных секторов бизнеса, включая финтех, здравоохранение и другие индустрии. Среди ключевых нововведений Java 8 следует отметить лямбда-выражения, стримы и изменения в API.

В свою очередь Java 9 также изобилует разнообразием обновлений “под капотом” и в API. Кроме очевидного проекта Jigsaw, на который возложена обязанность по внедрению модулярности в основные компоненты Java, новая версия может похвастаться ещё тремя важными фичами:

  1. Полная поддержка клиента HTTP 2.0: Вопрос в скорости, и HTTP 2.0 предоставляет более высокие результаты, колеблющиеся от 11.81% до 47.7% по сравнении с клиентом HTTP 1.1.
  2. Jshell: Новый инструмент командной строки. Если разработчик хочет автономно запустить несколько строк Java, то это можно выполнить без необходимости заворачивать все в отдельный метод или проект.
  3. 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)


  1. mrobespierre
    27.10.2017 02:59

    «Jigsaw» — обычно означает пазлы, но здесь, скорее всего, имеет место второе значение — лобзик (пила), из-за разделения на части. Релиз, кажется, на год задержали или больше?


    1. ad1Dima
      27.10.2017 06:59

      Как раз элементами пазлов обычно и представляют модули. Так что пазл — самое то.


      1. EreminD
        27.10.2017 10:57

        Но ведь только лобзиком можно что-то запилить или выпилить


        1. ad1Dima
          27.10.2017 11:04

          поэтому головоломка и называется Jigsaw puzzle — распиленная головоломка.


      1. mrobespierre
        27.10.2017 13:09

        в том то и дело, что речь не о самих модулях, а о процессе разделения платформы на части


        1. ad1Dima
          27.10.2017 13:39

          ну тогда это слово стоит воспринимать как глагол: лобзикование.


          1. MaxRokatansky Автор
            27.10.2017 14:20

            Вот да :) Всё-таки чисто лобзик — достаточно многогранная штука.


    1. kalininmr
      27.10.2017 12:59

      ну почемуже.
      именно пазлы имеется в виду.
      разбиение на кусочки.
      ИМХО


    1. MaxRokatansky Автор
      27.10.2017 13:06

      Пазл тут вполне себе в тему, т.к. как раз разделено уже на части и больше отражает суть, чем лобзик. Лично у меня лобзик вообще ассоциируется с уроками труда, а отнюдь не с разделением на части.

      Чуть больше года, насколько я помню. Переносы с прошлого лета пошли.


  1. TheKnight
    27.10.2017 03:41

    Благодарю за статью!
    А можно рассказать о причинах перевода термина " logging" как протоколирование?

    P.S.: Пишу не в личку, поскольку считаю причины выбора такого перевода полезными не только для меня.


    1. flatscode
      27.10.2017 06:11

      А можно рассказать о причинах перевода термина " logging" как протоколирование?

      А у вас какие предпочтения? Регистрация? Журналирование?
      Для этих двух вариантов есть омонимы, которые вспоминаются сходу.
      А для «протоколирование» я омонима даже и не вспомню.


      1. SirEdvin
        27.10.2017 07:28

        логгирование, например.


    1. MaxRokatansky Автор
      27.10.2017 13:02

      Хм. Внезапный вопрос… Вообще просто чаще используется в работе, поэтому привычнее протоколирование, чем, например, прямая транслитерация.


      1. TheKnight
        27.10.2017 13:14

        Принято, спасибо.


  1. ad1Dima
    27.10.2017 07:01

    Сначала прочитал Jshell как JS Hell, а не J Shell…


    1. SlavniyTeo
      27.10.2017 09:46

      Плюсанул бы, если б мог.

      Отличное название, я считаю.
      И так недостаточно людей в околопрограммистской тусовке путают Java и JavaScript.


      1. ad1Dima
        27.10.2017 09:49

        «А Слава КПСС — это вообще не человек...»


        1. vlanko
          27.10.2017 18:05

          уже репер=человек


  1. Ilya81
    27.10.2017 10:08

    Всё б хорошо, да только я так понимаю пользовательских value type так и нет? В Swift они есть. Я всегда предпочитал C# во многом из-за этого, но что мне не нравилось, что там константы возможны лишь для предопределённых типов. Ещё не совсем освоил Swift, особенно новинки 4-го, но, там, кажется со всеми этими моментами порядок. Java по мне определённо хорош классическим синтаксисом, а в C# зато обработка исключений сделана мягко говоря не лучшим образом, но в плане возможностей на фоне Swift 4 по мне это меркнет.

    Хотя, кажется, появляются ещё какие-то языки программирования, что я ещё освоить не успел. У понравившегося мне в своё время D чувствую шансов прижиться уже немного, но, впечатление, что улучшенные варианты уже есть. Вот только упомянутое в начале ограничение, насколько я понимаю, относится ко всему JVM.


    1. grossws
      27.10.2017 19:30

      У D вылезти на большую арену шансов уже очень мало. Особенно учитывая, что он не смог это сделать за полторы декады.


  1. solver
    27.10.2017 10:51

    Особенности предыдущей (8-й) версии благодаря своей универсальности предоставили разработчикам возможность создавать решения для самых разных секторов бизнеса, включая финтех, здравоохранение и другие индустрии.

    Т.е. вы это на полном серьезе утверждаете? Что только Java 8-й версии «предоставила разработчикам возможность создавать решения для самых разных секторов бизнеса, включая финтех, здравоохранение и другие индустрии.»? FacePalm… Маркетологи погубят этот мир…


  1. kovserg
    27.10.2017 12:50
    +1

    Можно ли запустить java9 на windows xp?


    1. MaxRokatansky Автор
      27.10.2017 14:19

      Вот не пробовали, если честно :) А это актуально?


      1. kovserg
        27.10.2017 14:32

        Да


        1. MaxRokatansky Автор
          27.10.2017 17:17

          А для чего?


    1. kalininmr
      28.10.2017 03:35

      похоже что нет.
      www.java.com/ru/download/faq/winxp.xml


      1. kalininmr
        28.10.2017 03:43

        хотя, быть может, альтернативные реализации и смогут.


  1. SMAX1
    27.10.2017 14:17

    Я слышал, что с выходом Java 9 появится AOT-компиляция. Она в итоге появилась или я что-то напутал?


    1. MaxRokatansky Автор
      27.10.2017 18:08

      Ahead Of Time Compilation (AOT) openjdk.java.net/jeps/295 действительно попала в java9, и доступна сейчас в OpenJDK jdk.java.net/9
      Это статическая компиляция java кода в нативный

      В последней сборке Oracle JDK (9.0.1) AOT отсутствует
      Утилита называется jaotc


  1. kovserg
    27.10.2017 14:24

    На телефонах Nokia была похожая вещь. Они компилировали jar и потом пускали бинарники. Это мягко говоря было ужасно.


    1. izzholtik
      27.10.2017 16:52

      На некоторых Sony-Ericsson получали рут исполнение произвольного кода патчингом AOT кэша.


  1. kovserg
    27.10.2017 14:42

    Еще о новшествах: где скачать Java9 JDK для 32bit windows?


    1. d_ilyich
      27.10.2017 17:12
      +1

      Официально, вероятно, нигде.


      1. kovserg
        27.10.2017 17:20

        И под ARM-ы не будет?


        1. grossws
          27.10.2017 19:32

          Вполне возможно, что будет. 8u151 есть под arm (и aarch32 и aarch64): http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html


          1. kovserg
            27.10.2017 22:28

            Я так понял что java9 это не LTS, а морковка. Т.е. переходить на неё не стоит, надо подождать нормальную версию или использовать проверенную.
            image


            1. vlanko
              28.10.2017 17:51

              после 9й все релизы будут частыми.


    1. dasFlug
      27.10.2017 17:12
      +1

      Официального 32bit JDK нет. Можно попробовать собрать самому как советует Марк Рейнхольд.


  1. gricom
    27.10.2017 16:10

    Для кого эта статья? Если для программистов, то неплохо было бы привести примеры кода «до» и «после».


    1. MaxRokatansky Автор
      27.10.2017 17:17
      -1

      Это обобщённая статья для всех и, разумеется, не последняя. В следующих как раз рассмотрим практические примеры по разным аспектам


      1. solver
        30.10.2017 11:29

        >и, разумеется, не последняя

        Надеюсь последующие статьи будут писать не маркетологи, а технари…


  1. grossws
    27.10.2017 19:25

    G1, который был представлен в Java 7 и был разработан для лучшей поддержки куч размером более 4GB. Он вызывает меньше GC пауз, но если они все же происходят, то длятся дольше.

    ШТА?! G1 старается держать паузы предсказуемыми и их может быть больше или меньше в зависимости от параметра MaxGCPauseMillis. И эти паузы могут быть запросто меньше, чем в старых gc типа CMS. G1 на основе предыдущих сборок оценивает сколько регионов он сможет обработать при очередной сборке.


    1. grossws
      27.10.2017 19:35

      Стоит добавить, что чисто маркетоидное "http/2 быстрее" очень спорно. Особенно, если не уточнить в каком смысле и при каких условиях. Там в первую очередь интересна экономия сокетов, мультиплексирование, приоритизация мультиплексированных потоков, потенциальное уменьшение latency и server push.


      1. MaxRokatansky Автор
        27.10.2017 19:41

        http/2 у нас как раз в первую очередь пойдёт на отдельную заметку и практику. Так что там будет более подробно это раскрыто.
        В рамках такой сравнительной статьи, разумеется, не хватает глубины по каждому пункту, но это поправим в следующих выпусках.


        1. grossws
          27.10.2017 19:43

          Это, извините, выглядит не как "не хватает глубины по каждому пункту", а как вопиющая некомпетентность. Как с тем же G1GC.