Статьи

Java 9 — окончательный список возможностей

Java-9-телескоп
Этот пост будет обновлен новыми функциями, предназначенными для предстоящего выпуска Java 9 ( последнее обновление: 9/9/2014)

Разработка OpenJDK набирает обороты: после запуска Java 8 в марте 2014 года мы ожидаем двухлетний цикл выпуска. Java 9, как сообщается, будет выпущена в 2016 году, и ранний список JEP (предложений по расширению JDK), нацеленных на выпуск, уже был опубликован. Более того, некоторые JSR (запросы спецификации Java) уже работают, и мы также добавили подсказку о других возможностях, которые могут быть включены.

Флагманские функции — это проект Jigsaw, значительные улучшения производительности и долгожданные API, в том числе: обновления API процессов, JSON как часть java.util и API обработки денег. Для тех из вас, кто хочет быть на переднем крае, ранние сборки доступа JDK 9 уже доступны здесь .

В этом посте мы будем постоянно обновлять основные новые функции Java 9 и рассказывать о них. Так что следите за обновлениями!

Содержание

  1. [Принято] Проект Jigsaw — Модульный исходный код
  2. [Принято] Процесс обновления API
  3. [Принято] Легкий JSON API
  4. [Принято] Деньги и валюта API
  5. [Принято] Улучшенная блокировка
  6. [Принято] Сегментированный кэш кода
  7. [Принято] Компиляция Smart Java — Фаза Два
  8. [Ожидается] HTTP 2 Клиент
  9. [Ожидается] REPL в Java
  10. Откуда появляются новые функции?

Принятые функции

1. Проект Jigsaw — модульный исходный код

Цель проекта Jigsaw состоит в том, чтобы сделать Java модульным и разбить JRE на функционально совместимые компоненты, что является одной из наиболее популярных функций для Java 9. Этот JEP является первым из четырех шагов к Jigsaw и не изменит фактическую структуру JRE и JDK. Цель этого шага — реорганизовать исходный код JDK в модули, усовершенствовать систему сборки для компиляции модулей и установить границы модулей во время сборки. Первоначально проект был предназначен для Java 8, но с тех пор был отложен и переназначен на Java 9.

Как только он будет завершен, он позволит создать уменьшенный Jar (rt.jar) времени выполнения, настроенный для компонентов, которые действительно нужны проекту. В JDK 7 и JDK 8 rt.jar содержится около 20 000 классов, которые являются частью JDK, даже если многие из них на самом деле не используются в конкретной среде (хотя частичное решение включено в функцию компактных профилей Java 8). Мотивация заключается в том, чтобы сделать Java легко масштабируемой для небольших вычислительных устройств (Internet of Things), повысить безопасность и производительность, а также облегчить разработчикам создание и обслуживание библиотек.

Подробнее о JEP 201

2. Обрабатывать обновления API

До сих пор была ограниченная способность контролировать и управлять процессами операционной системы с Java. Например, чтобы сделать что-то столь же простое, как получение PID вашего процесса сегодня, вам потребуется либо получить доступ к собственному коду, либо использовать какой-то обходной путь. Более того, для каждой платформы потребуется разная реализация, чтобы гарантировать, что вы получите правильный результат.

В Java 9 ожидается код для получения PID Linux, который теперь выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
public static void main(String[] args) throws Exception
{
    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);
    }
}

Чтобы превратиться во что-то вроде этого (которое также поддерживает все операционные системы):

1
System.out.println("Your pid is " + Process.getCurrentPid());

Обновление расширит возможности Java по взаимодействию с операционной системой: новые прямые методы для обработки PID, имен и состояний процессов, а также возможность перечисления JVM и процессов и многое другое.

Подробнее о JEP 102

3. Облегченный JSON API

В настоящее время существуют альтернативы для обработки JSON в Java, уникальным в этом API является то, что он будет частью языка, легок и будет использовать новые возможности Java 8. И будет доставлен прямо через java.util (в отличие от JSR 353). который использует внешний пакет или другие альтернативы ).

** Образцы кода скоро!

Подробнее о JEP 198

4. Деньги и валюта API

После нового API даты и времени, представленного в Java 8, в Java 9 появился новый официальный API для представления, транспортировки и выполнения комплексных вычислений с помощью Money и Currency. Чтобы узнать больше о проекте, вы можете посетить JavaMoney на Github. Код и примеры использования уже доступны прямо здесь. Вот несколько основных моментов:

1
2
3
Money amt1 = Money.of(10.1234556123456789, "USD"); // Money is a BigDecimal
FastMoney amt2 = FastMoney.of(123456789, "USD"); // FastMoney is up to 5 decimal places
Money total = amt1.add(amt2);

Новые типы денег: Money & FastMoney

1
2
3
4
MonetaryAmountFormat germanFormat = MonetaryFormats.getAmountFormat(
Locale.GERMANY);
 
System.out.println(germanFormat.format(monetaryAmount)); // 1.202,12 USD

Форматирование денег по разным странам

Подробнее о JSR 354

5. Улучшите запертую блокировку

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

Подобные стресс-тесты доводят виртуальные машины JVM до предела и пытаются определить максимальную пропускную способность, которую они могут достичь, обычно с точки зрения количества сообщений в секунду. Амбициозная метрика успеха для этого JEP является значительным улучшением по сравнению с 22 различными тестами. Если усилия увенчаются успехом, эти улучшения производительности будут внедрены в Java 9.

Подробнее о JEP 143

6. Кэш-память сегментированного кода

Еще одно улучшение производительности для Java 9 связано с JIT-компилятором. Когда определенные области кода выполняются быстро, ВМ компилирует их в собственный код и сохраняет их в кеше кода. Это обновление рассматривает сегментацию кэша кода для различных областей скомпилированного кода, чтобы улучшить производительность компилятора.

Вместо одной области кэш кода будет сегментирован на 3 по времени жизни кода в кэше:

  • Код, который останется в кэше навсегда (внутренний / не код метода JVM)
  • Короткое время жизни (профилированный код, специфичный для определенного набора условий)
  • Потенциально долгий срок службы (непрофилированный код)

Сегментация позволит добиться нескольких улучшений производительности. Например, уборщик метода сможет пропускать код, не относящийся к методу, и действовать быстрее.

Подробнее о JEP 197

7. Компиляция Smart Java, Фаза Два

Средство Smart Java Compilation, или sjavac, было впервые разработано в рамках JEP 139 , чтобы повысить скорость сборки JDK за счет запуска компилятора javac на всех ядрах. С JEP 199 он входит во вторую фазу, где он будет улучшен и обобщен, чтобы его можно было использовать по умолчанию и создавать другие проекты, кроме JDK.

Подробнее о JEP 199

Чего еще ожидать?

8. HTTP 2 Клиент

HTTP 2.0 еще не был выпущен в качестве стандарта, но вскоре он будет представлен для окончательного рассмотрения, и ожидается, что он будет завершен до выпуска Java 9. JEP 110 определит и реализует новый HTTP-клиент для Java, который заменит HttpURLConnection, а также реализовать HTTP 2.0 и веб-сокеты. Он еще не был опубликован как принятый JEP, но нацелен на Java 9, и мы ожидаем, что он будет включен.

Официальная дата выпуска HTTP 2.0 RFC в настоящее время назначена на февраль 2015 года, основываясь на алгоритме Google SPDY. SPDY уже продемонстрировал значительные улучшения скорости по сравнению с HTTP 1.1 в диапазоне от 11,81% до 47,7%, и его реализация уже существует в большинстве современных браузеров.

Подробнее о JEP 110

9. Проект Кулла — REPL на Яве

Недавно было объявлено, что вряд ли удастся выпустить Java 9, но он может сделать это вовремя с целевой датой интеграции, установленной в апреле 2015 года. Сегодня нет «нативного» Java-способа REPL (Read-Eval-Print-Loop). Это означает, что если вы хотите запустить несколько строк Java, чтобы проверить их самостоятельно, вам придется обернуть все это в отдельный проект или метод. Существуют надстройки REPL для популярных IDE и некоторых других решений, таких как Java REPL, но пока нет официального способа сделать это — Project Kulla может быть ответом.

Подробнее о проекте Кулла

Бонус: откуда берутся новые функции?

JEP и JSR обычно не появляются из ниоткуда, вот структура, которая объединяет все это:

  • Группы — отдельные лица и организации, имеющие обоюдный интерес к широкому предмету или конкретному фрагменту кода. Вот некоторые примеры: Безопасность, Сеть, Swing и HotSpot.
  • Проекты — усилия по созданию основной части кода, документации или других усилий. Должен быть спонсором хотя бы одной группы. Недавние примеры — Project Lambda, Project Jigsaw и Project Sumatra.
  • Предложение по усовершенствованию JDK ( JEP ) — позволяет неофициально продвигать новую спецификацию до или параллельно с JCP, когда требуется дальнейшее изучение. Принятые JEP становятся частью дорожной карты JDK и им присваивается номер версии.
  • Запрос спецификации Java ( JSR ) — фактическая спецификация функции происходит на этом этапе, может быть либо через группы / проекты, JEP или от отдельных членов JCP (Java Community Process). Зонт JSR обычно открывается для каждой версии Java, это еще не произошло с Java 9. Отдельные члены сообщества могут также предлагать новые запросы спецификации Java.