- PVSM.RU - https://www.pvsm.ru -

Систематизированный список всех функций Java и JVM в Java 8-15

Последнее обновление: 29.09.2020, вклющее изменения до JDK 15 [1] .

С момента выпуска версии 8 до версии 15 Java формируется 163 предложениями по расширению JDK [2] (JEP), каждое из которых вносит некоторые улучшения в платформу. Эта страница представляет собой систематизированный и тщательно подобранный список наиболее важных улучшений.

Систематизированный список всех функций Java и JVM в Java 8-15 - 1

Содержание

  • Новые языковые функции

  • Новые API

  • Улучшения производительности

  • Улучшения безопасности

  • Изменения байт-кода

  • Запуск

  • Упаковка

  • Javadoc

  • Новые платформы

  • Прекращение поддержки и удаление

  • Схема новой версии

Полный список JEP можно найти на веб-сайте OpenJDK в проектах jdk [3] и jdk9 [4] .

Все функции обычно доступны и включены по умолчанию, за исключением случаев, когда они помечены одним из следующих значений:

  • Предварительный просмотр  функции полностью определены и реализованы, но еще не считаются окончательными. Они считаются почти завершенными, ожидая дополнительного раунда реальных отзывов. Они должны быть явно включены [5] .

  • Экспериментальные  функции менее стабильны и с большей вероятностью изменятся. Они также должны быть явно включены.

  • Модули инкубатора не являются финальными инструментами и API и распределены в отдельных модулях [6] .

Новые языковые функции

Когда в Java 8 появились лямбды, это было довольно значительным изменением. Хотя последние версии не добавляли таких впечатляющих функций, в язык было внесено множество небольших улучшений.

Вот краткий обзор того, что произошло за последние годы. Более подробное руководство см. В разделе Новые возможности языка, начиная с Java 8 [7] .

  • Текстовые блоки

    JDK 15 [8] (предварительная версия [9] в JDK 14 и  [9]JDK 13 [10] )

    String html = """
                <html>
                    <body>
                        <p>Hello, world</p>
                    </body>
                </html>
                """;
  • Запечатанные классы могут ограничивать, какие другие классы могут их расширять ( предварительная версия )

    JDK 15 [11]

    public abstract sealed class Shape
        permits Circle, Rectangle {...}
    
    public class Circle extends Shape {...} // OK
    public class Rectangle extends Shape {...} // OK
    public class Triangle extends Shape {...} // Compile error
    
    // No need for default case if all permitted types are covered
    double area = switch (shape) {
        case Circle c    -> Math.pow(c.radius(), 2) * Math.PI
        case Rectangle r -> r.a() * r.b()
    };
  • Записи ( Превью)

    JDK 15 [12] и JDK 14 [13]

    record Point(int x, int y) { }
  • Сопоставление с образцом для instanceof (Предварительный просмотр)

    JDK 15 [14] и JDK 14 [15]

    if (obj instanceof String s) {
        System.out.println("obj is a String and it' length is " + s.length());
    }
  • Выражение переключателя

    JDK 14 [16] (предварительная версия [17] в JDK 12 [17] и JDK 13 [18])

    int numLetters = switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> 6;
        case TUESDAY                -> 7;
        default      -> {
          String s = day.toString();
          int result = s.length();
          yield result;
        }
    };
  • Полезные исключения NullPointerExceptions, точно описывающие, какая переменная была null

    JDK 15 [19] (Включено -XX:+ShowCodeDetailsInExceptionMessagesв JDK 14 [20] )

    a.b.c.i = 99;
    ---
    Exception in thread "main" java.lang.NullPointerException:
          Cannot read field "c" because "a.b" is null
  • Введение varчтобы сделать объявления локальных переменных менее церемонными

    JDK 11 [21] (без поддержки лямбда в JDK 10 [22] )

    var greeting = "Hello World!";
  • Подключаемая и обратно совместимая модульная система, позволяющая избежать исключения ClassDefNotFoundErrorsво время выполнения и создавать внутренние API

    JDK 9 [23] (Project Jigsaw)

    module hu.advancedweb.helloworld {
        requires hu.advancedweb.somedependency;
        exports hu.advancedweb.hello
    }
  • Частные методы в интерфейсах
    JDK 9 [24] (Проект Milling Coin)

  • Оператор Diamond для анонимных внутренних классов
    JDK 9 [24] (Проект Milling Coin)

  • Try-with-resources позволяющая эффективно использовать final переменные
    JDK 9 [24] (Проект Milling Coin)

  • @SafeVargsв  методах частного экземпляра
    JDK 9 [24] (Проект Milling Coin)

  • Нет предупреждений об устаревании для importоператоров
    JDK 9 [24]

Новые API

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

Если вам интересно узнать обо всех различиях уровней API между Java 8 и 14, посмотрите AdoptOpenJDK / jdk-api-diff на GitHub [25] .

Общее

  • Поддержка неизменяемых сопоставленный с памятью байтовых буферов (Non-Volatile Mapped Byte Buffers) в API-интерфейсе FileChannel
    JDK 14 [26]

  • Files.mismatch: найти первый несовпадающий байт в содержимом двух файлов
    JDK 12 [27]

  • Collectors.teeingдля создания коллектора, который представляет собой смесь двух нижележащих сборщиков
    JDK 12 [28]

  • Улучшения строк: indentи transform
    JDK 12 [29]

  • Стандартный HTTP-клиент с поддержкой HTTP/2, WebSocket и неблокирующим API

    JDK 11 [30] ( Incubator в JDK 9 [31] )

    HttpClient httpClient = HttpClient.newBuilder().build();
    
    HttpRequest request =
      HttpRequest.newBuilder()
        .uri(URI.create("https://advancedweb.hu/"))
        .GET()
        .build();
    
    HttpResponse<String> response =
      httpClient.send(request, BodyHandlers.ofString());
  • Усовершенствования строк - методы: isBlanklinesrepeatи strip
    JDK 11 [32]

  • Методы фабрики удобства для коллекций, решающие проблему отсутствия литералов коллекции

    JDK 9 [33]

    Set<Integer> mySet = Set.of(1, 2, 3);
    List<Integer> myList = List.of(1, 2, 3);
    Map<String, Integer> myMap = Map.of("one", 1, "two", 2);
  • Фреймвок публикации-подписки Reactive Streams для обработки асинхронных потоков с неблокирующим обратным давлением
    JDK 9 [33]

  • Связанные со временем улучшения CompletableFuture(тайм-аут, задержка)
    JDK 9 [33]

  • Больше возможностей для преобразования ( dropWhiletakeWhile) и генерации ( iterateofNullable) потоков; сборщики только для чтения ( toUnmodifiableList); опции могут быть преобразованы в потоки
    JDK 9 [34]

  • Arrays.mismatch: найти первый несовпадающий элемент между двумя массивами
    JDK 9 [35]

  • Stack-Walking API, который позволяет использовать ленивый подход и фильтрацию кадров
    JDK 9 [36]

  • API процессов предоставляет дополнительную информацию и контроль (например, идентификатор процесса, аргументы, время ЦП, родительские / дочерние процессы), а также улучшения ProcessBuilder помогающие создавать конвейеры процессов
    JDK 9 [37]

  • VarHandleAPI для замены операций, связанных с полями и массивами, java.util.concurrent.atomicи sun.misc.Unsafeдля обеспечения низкоуровневых механизмов доступа, например, атомарной записи.
    JDK 9 [38]

  • Новые комбинаторы и методы поиска для MethodHandle
    JDK 9 [39]

  • Расширенная политика устаревания. @Deprecatedможет быть отмечен значком forRemoval, который выдает новое предупреждение.
    JDK 9 [40]

  • OASIS Standard XML Catalog API для безопасного и производительного управления внешними ресурсами в XML
    JDK 9 [41]

  • Обновите анализатор XML JDK, Xerces, до версии 2.11.0
    JDK 9 [42]

  • Поддержка TIFF для Image I/O Framework

    JDK 9 [43]

Интернационализация

  • Unicode 10.0, добавление примерно 27000 символов, 10 блоков и более 30 скриптов
    JDK 11 [44] (поддержка Unicode 8.0 в JDK 9 [45] )

  • java.util.Localeи связанные API поддерживают тип валюты, часовой пояс и многое другое.
    JDK 10 [46]

  • ResourceBundleзагружает файлы свойств в UTF-8 вместо ISO-8859-1
    JDK 9 [47]

  • Данные локали CLDR включены по умолчанию
    JDK 9 [48]

Графика и настольные приложения

  • Функции рабочего стола для всех платформ, такие как прослушиватель событий входа / вывода / блокировки и взаимодействие с панелью задач
    JDK 9 [49]

  • MultiResolutionImageкоторый упрощает получение изображения с определенным разрешением для DPI
    JDK 9 [50]

  • Графика HiDPI в Windows и Linux
    JDK 9 [51]

  • Включение GTK 3 в Linux для JavaFX, Swing и AWT
    JDK 9 [52]

  • Замена тегов Javadoc @beaninfoи @BeanInfoаннотациями для Swing
    JDK 9 [53]

  • Обновление GStreamer, включенннное в JavaFX / Media, до версии 1.4.4
    JDK 9 [54]

  • Замена существующего механизм компоновки шрифтов ICU OpenType на HarfBuzz
    JDK 9 [55]

Улучшения производительности

Общее

  • API доступа к внешней памяти для безопасного и эффективного использования памяти вне кучи ( инкубатор )
    JDK 15  [56]JDK 14 [57]

  • Включение динамическое архивирование классов в конце выполнения Java-приложения
    JDK 13 [58]

  • Совместное использование данных классов приложений для сокращения времени запуска и уменьшения занимаемой площади за счет обмена метаданными классов между процессами Java.
    JDK 10 [59]

  • Архив с совместным использованием данных классов для списка классов по умолчанию включен по умолчанию, чтобы сократить время запуска "из коробки"
    JDK 12 [60]

  • Компактные строки с компактным размером, более эффективно хранящие [61] строки только для Latin-1
    JDK 9 [61]

  • Кеши кода профилированного и непрофилированного скомпилированного кода разделены, что приводит к повышению производительности и увеличению объема памяти
    JDK 9 [62]

  • Хранение интернированных строк в архивах совместного использования данных классов, чтобы уменьшить потребление памяти
    JDK 9 [63]

Библиотека

  • Улучшенные встроенные функции для java.lang.Math sincosи logфункции на процессорах AArch64
    JDK 11 [64]

  • Улучшения производительности Security Manager
    JDK 9 [65]

  • Spin-Wait Hint ( Thread#onSpinWait) для оптимизации циклов в стиле «занято-ожидание»
    JDK 9 [66]

  • Использование Marlin Renderer в Java 2D в качестве растеризатора графики по умолчанию вместо Pisces
    JDK 9 [67]

  • Повышена производительность GHASH и RSA за счет использования недавно представленных инструкций процессора SPARC и Intel x64
    JDK 9. [68]

Параллелизм

  • Thread-Local Handshakes (Локальные рукопожатия потока) для остановки отдельных потоков
    JDK 10 [69]

  • Улучшена производительность мониторов конкурирующих [70] объектов
    JDK 9 [70]

  • Дополнительное пространство в стеке потоков для критических секций, снижающее риск тупиковой ситуации при java.util.concurrentблокировках в случае переполнения стека
    JDK 9 [71]

Компилятор

  • Возможность предварительной компиляции для Linux ( экспериментальная )
    JDK 10 [68] (Graal как экспериментальный JIT-компилятор) JDK 9 [72] (интерфейс JVM-компилятора) JDK 9 [73] (Graal как AoT-компилятор)

  • Повышение производительности в javac: новая стратегия проверки типов многоязычных выражений
    JDK 9 [74]

Сборщик мусора G1 (по умолчанию)

  • Распределение памяти с учетом NUMA
    JDK 14 [75]

  • Возможность прерывания смешанных коллекций для обеспечения поставленной пользователем паузы
    JDK 12 [76]

  • Автоматический возврат память кучи в операционную систему при простое
    JDK 12 [77]

  • Параллельный полный сборщик мусора для уменьшения [78] задержек в худшем случае
    JDK 10 [78]

  • Сборщик мусора G1 теперь по умолчанию вместо Parallel GC
    JDK 9 [79]

Другие сборщики мусора

  • Z Garbage Collector, предлагающий очень малое время задержки для больших куч
    JDK 15 [80] ( экспериментальный в JDK 14 [81] (Windows) JDK 14 [82] (OS X) JDK 11 [83] (Linux))

  • Сборщик мусора Shenandoah, предлагающий те же преимущества, что и ZGC, но основанный на другом алгоритме
    JDK 15 [84] ( экспериментальный в JDK 12 [85])

  • Сборщик мусора Epsilon, который не реализует фактическое восстановление памяти, стремясь к минимально возможным накладным расходам
    JDK 11 [86]

  • XX:AllocateHeapAt=&lt;path>для поддержки альтернативных устройств памяти
    JDK 10 [87]

Диагностика и инструменты

  • Потоковая передача событий Flight Recorder: данные профилирования доступны через API [88] , что делает его пригодным для непрерывного мониторинга
    JDK 14 [89]

  • Microbenchmark Suite на основе JMH
    JDK 12 [90]

  • Flight Recorder является частью OpenJDK
    JDK 11 [91]

  • Профилирование кучи с низкими издержками через JMTI
    JDK 11 [92]

  • Управляемый во время выполнения и специфичный для метода контроль компиляторов C1 и C2, который позволяет включать тесты
    JDK 9 [93]

  • Детализированная, простая в настройке система ведения журнала для всех компонентов JVM
    JDK 9 [94] (унифицированное ведение журнала JVM) JDK 9 [95] (унифицированное ведение журнала сборщика мусора)

  • Разрешить приложению предоставлять реализацию системы журналирования для использования классами платформы
    JDK 9 [96]

Улучшения безопасности

  • Набор сертификатов корневого центра сертификации (CA) по умолчанию предоставляется с JDK, поэтому соединения TLS работают из коробки
    JDK 10 [97]

  • Валидация входящих данных сериализации
    JDK 9 [98]

  • Тип хранилища ключей по умолчанию - стандартный PKCS12 вместо проприетарного JKS
    JDK 9. [99]

  • Основанный на DRBGSecureRandom
    JDK 9 на [100] 

  • Отключить цепочки сертификатов X.509 с подписями на основе SHA-1
    JDK 9 [101]

  • Хеш-алгоритмы SHA-3
    JDK 9 [102]

TLS

  • Поддержка TLS 1.3
    JDK 11 [103]

  • Datagram Transport Layer Security (DTLS) API
    JDK 9 [104]

  • OCSP сшивает TLS для улучшения производительности проверки статуса сертификата
    JDK 9 [105]

  • TLS Application-Layer Protocol Negotiation (ALPN) Extension, который обеспечивает согласование протокола без дополнительных циклов передачи; ALPN - требование для соединений HTTP/ 2
    JDK 9 [106]

Крипто

  • Алгоритм цифровой подписи по кривой Эдвардса (EdDSA) - RFC8032 [107]
    JDK 15 [108]

  • Ключевое соглашение с Curve25519 и Curve448
    JDK 11 [109]

  • Криптографические алгоритмы ChaCha20 и Poly1305
    JDK 11 [110]

Запуск

  • Запуск однофайловых программ с исходным кодом, включая поддержку shebang(#!) строки в Unix
    JDK 11 [111]

  • jshell: Java REPL
    JDK 9 [112] (Project Kulla)
    → Связано: Создание прототипов с помощью JShell [113]

  • Компиляция для Старых Версий платформы с --release, который конфигурирует --sourceи --targetи ссылок против соответствующей версии платформы
    JDK 9 [114]

  • Ранняя проверка флагов командной строки JVM во избежание сбоев
    JDK 9 [115]

Упаковка

  • Packaging Tool, поддерживающий собственные форматы пакетов: msi, exe, pkg, dmg, deb и rpm ( Incubator )
    JDK 14 [116]

  • jlinkКомпоновщик Java, который может создать оптимизированный тонкий образ времени выполнения для модульного приложения Java, который содержит только необходимые части JDK
    JDK 9 [117] - [ 2 [118] ], [ 3 [119] ], [ 4 [120] ], [ 4 [121] ], [ 5 [122] ]

  • Файлы JAR с несколькими релизами, позволяющие использовать несколько версий класса для конкретных релизов Java в одном архиве
    JDK 9 [123]

Javadoc

  • Инструмент Javadoc теперь генерирует разметку HTML5 вместо макета на основе фреймов, а документация содержит поле поиска для облегчения навигацииJDK 9 [124] - [ 2 [125] ], [ 3 [126] ]

Байт-код

  • Замена Unsafe::defineAnonymousClass()на Lookup::defineHiddenClass(), предназначенная для фреймворков для динамического создания скрытых классов, которые не могут быть обнаружены, связаны и использованы напрямую другими классами. 

    JDK 15 [127]

  • Пакет java.lang.invoke.constant, позволяющий легко описывать загружаемые константы (операнды для ldcинструкции), что менее подвержено ошибкам, чем использование специального строкового представления
    JDK 12 [128]

  • CONSTANT_Dynamicзапись постоянного пула, которая использует загрузку для выполнения разрешения, аналогично INVOKEDYNAMICвызовам
    JDK 11 [129]

  • Введение контекста управления доступом Nest, который объединяет классы в одну и ту же сущность кода - например, вложенные классы - и устраняет необходимость для компилятора вставлять методы моста в сгенерированный байт-код.
    JDK 11 [130]

  • Байт-код, созданный для статической конкатенации строк, использует invokedynamic вместо прямого создания StringBuilder#append цепочек. Это позволит в будущем оптимизировать конкатенацию строк без изменения байт-кода.
    JDK 9 [131]

  • INVOKEDYNAMIC может выражать высокоуровневые операции со свойствами объекта и / или коллекциями
    JDK 9 [132]

Новые поддерживаемые платформы

  • Linux / AArch64
    JDK 9 [133]

  • Linux / s390x
    JDK 9 [134]

  • Унифицированная рука32 / рука64
    JDK 9 [135]

Схема новой версии

  • Более простая схема строки версии.

    JDK 9  [136]JDK 10 [137]

Устаревание и удаление

  • Удалена Nashorn Javascript Engine и jjsинструмент
    JDK 15 [138] (не рекомендуется в JDK 11 [139] )

  • Удалены порты Solaris и SPARC
    JDK 15 [140] (устарело в JDK 14 [141] )

  • Устарела активация RMI [142] , влияющая на java.rmi.activationпакет и rmidинструмент, не влияет на Java RMI в целом
    JDK 15 [143]

  • Отключена предвзятая блокировк [144]а по умолчанию, исключены соответствующие флаги командной строки
    JDK 15 [145]

  • Устарела Unsafe::defineAnonymousClass()
    JDK 15 [127]

  • Удален сборщик мусора Concurrent Mark Sweep (CMS)
    JDK 14 [146]

  • Устарела комбинация ParallelScavenge + SerialOld GC
    JDK 14 [147]

  • Удалены инструменты Pack200 и API
    JDK 14 [148]

  • Устарели инструменты Pack200 и API
    JDK 11 [149]

  • Удалена Java EE
    JDK 11 [150]

  • Удалена CORBA
    JDK 11 [30]

  • Удалены Thread#destroyи Thread#stop
    JDK 11 [151]

  • varбольше не является допустимым именем класса
    JDK 10 [22]

  • Удален инструмент javah
    JDK 10 [152]

  • Подчеркивание больше не является действительным идентификатором
    JDK 9 [24]

  • Внутренние API ( sun.*) удалены или устарели
    JDK 9 [122]2 [153] ]

  • Удален apple.applescriptи com.appleупакован
    JDK 9 [49]

  • Отключены цепочки сертификатов X.509 с подписями на основе SHA-1
    JDK 9 [101]

  • Удалить директивы выбора версии JRE при запуске: JRE-Versionзапись в манифесте и -version:параметр cli
    JDK 9 [154]

  • Удален инструмент jhat
    JDK 9 [155]

  • Удален JVM TI hprof Agent
    JDK 9 [156]

  • Удалены комбинации GC, устаревшие в JDK 8
    JDK 9 [157]

  • ResourceBundle загружает файлы свойств в UTF-8 вместо ISO-8859-1
    JDK 9 [47]

  • Устарело API апплета
    JDK 9 [158]

  • Устарела Concurrent Mark Sweep Garbage Collector
    JDK 9 [159]

  • Устарела Object.finalize()
    JDK 9 [160]

  • Удалены механизмы переопределения одобренных стандартов ( lib/endorsed) и расширений ( lib/ext) из JRE
    JDK 9 [161]

  • Удален rt.jarиз JRE
    JDK 9 [161]

Если вам интересно узнать обо всех различиях API между Java 8 и 14, посмотрите сайт проекта Java Almanac [162] . Также ознакомьтесь с jdeps [163] , анализатором зависимостей классов Java, чтобы узнать, использует ли ваш проект старый внутренний API.

Резюме

JDK 8 [164] был выпущен в 2014 году. Нам пришлось ждать выхода JDK 9 [4] три с половиной года . Но с тех пор дела пошли быстрее. У Java есть новая структура релизов, цель которой - выпускать новую версию каждые шесть месяцев.

Хотя Java 8 все еще поддерживается, переход на последнюю версию вносит в таблицу значительное количество улучшений.

Автор: val6852

Источник [165]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/357572

Ссылки в тексте:

[1] JDK 15: https://openjdk.java.net/projects/jdk/15/

[2] предложениями по расширению JDK: http://openjdk.java.net/jeps/0

[3] проектах jdk: https://openjdk.java.net/projects/jdk/

[4] jdk9: https://openjdk.java.net/projects/jdk9/

[5] явно включены: https://openjdk.java.net/jeps/12

[6] распределены в отдельных модулях: https://openjdk.java.net/jeps/11

[7] Новые возможности языка, начиная с Java 8: https://advancedweb.hu/new-language-features-since-java-8-to-14/

[8] JDK 15: https://openjdk.java.net/jeps/378

[9] версия: https://openjdk.java.net/jeps/368

[10] JDK 13: https://openjdk.java.net/jeps/355

[11] JDK 15: https://openjdk.java.net/jeps/360

[12] JDK 15: https://openjdk.java.net/jeps/384

[13] JDK 14: https://openjdk.java.net/jeps/359

[14] JDK 15: https://openjdk.java.net/jeps/375

[15] JDK 14: https://openjdk.java.net/jeps/305

[16] JDK 14: https://openjdk.java.net/jeps/361

[17] версия: https://openjdk.java.net/jeps/325

[18] JDK 13: https://openjdk.java.net/jeps/354

[19] JDK 15: https://bugs.openjdk.java.net/browse/JDK-8233014

[20] JDK 14: https://openjdk.java.net/jeps/358

[21] JDK 11: https://openjdk.java.net/jeps/323

[22] JDK 10: https://openjdk.java.net/jeps/286

[23] JDK 9: https://openjdk.java.net/jeps/261

[24] JDK 9: https://openjdk.java.net/jeps/213

[25] AdoptOpenJDK / jdk-api-diff на GitHub: https://github.com/AdoptOpenJDK/jdk-api-diff

[26] JDK 14: https://openjdk.java.net/jeps/352

[27] JDK 12: https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/nio/file/Files.html

[28] JDK 12: https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/stream/Collectors.html#teeing(java.util.stream.Collector,java.util.stream.Collector,java.util.function.BiFunction)

[29] JDK 12: https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/String.html

[30] JDK 11: https://openjdk.java.net/jeps/321

[31] JDK 9: https://openjdk.java.net/jeps/110

[32] JDK 11: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html

[33] JDK 9: https://openjdk.java.net/jeps/266

[34] JDK 9: https://docs.oracle.com/javase/9/docs/api/java/util/stream/Stream.html#iterate-T-java.util.function.UnaryOperator-

[35] JDK 9: https://docs.oracle.com/javase/9/docs/api/java/util/Arrays.html#mismatch-java.lang.Object:A-java.lang.Object:A-

[36] JDK 9: https://openjdk.java.net/jeps/259

[37] JDK 9: https://openjdk.java.net/jeps/102

[38] JDK 9: https://openjdk.java.net/jeps/193

[39] JDK 9: https://openjdk.java.net/jeps/274

[40] JDK 9: https://openjdk.java.net/jeps/277

[41] JDK 9: https://openjdk.java.net/jeps/268

[42] JDK 9: https://openjdk.java.net/jeps/255

[43] JDK 9: https://openjdk.java.net/jeps/262

[44] JDK 11: https://openjdk.java.net/jeps/327

[45] JDK 9: https://openjdk.java.net/jeps/267

[46] JDK 10: https://openjdk.java.net/jeps/314

[47] JDK 9: https://openjdk.java.net/jeps/226

[48] JDK 9: https://openjdk.java.net/jeps/252

[49] JDK 9: https://openjdk.java.net/jeps/272

[50] JDK 9: https://openjdk.java.net/jeps/251

[51] JDK 9: https://openjdk.java.net/jeps/263

[52] JDK 9: https://openjdk.java.net/jeps/283

[53] JDK 9: https://openjdk.java.net/jeps/256

[54] JDK 9: https://openjdk.java.net/jeps/257

[55] JDK 9: https://openjdk.java.net/jeps/258

[56] JDK 15 : https://openjdk.java.net/jeps/383

[57] JDK 14: https://openjdk.java.net/jeps/370

[58] JDK 13: https://openjdk.java.net/jeps/350

[59] JDK 10: https://openjdk.java.net/jeps/310

[60] JDK 12: https://openjdk.java.net/jeps/341

[61] хранящие: https://openjdk.java.net/jeps/254

[62] JDK 9: https://openjdk.java.net/jeps/197

[63] JDK 9: https://openjdk.java.net/jeps/250

[64] JDK 11: https://openjdk.java.net/jeps/315

[65] JDK 9: https://openjdk.java.net/jeps/232

[66] JDK 9: https://openjdk.java.net/jeps/285

[67] JDK 9: https://openjdk.java.net/jeps/265

[68] JDK 9.: https://openjdk.java.net/jeps/246

[69] JDK 10: https://openjdk.java.net/jeps/312

[70] конкурирующих: https://openjdk.java.net/jeps/143

[71] JDK 9: https://openjdk.java.net/jeps/270

[72] JDK 9: https://openjdk.java.net/jeps/243

[73] JDK 9: https://openjdk.java.net/jeps/295

[74] JDK 9: https://openjdk.java.net/jeps/215

[75] JDK 14: https://openjdk.java.net/jeps/345

[76] JDK 12: https://openjdk.java.net/jeps/344

[77] JDK 12: https://openjdk.java.net/jeps/346

[78] уменьшения: https://openjdk.java.net/jeps/307

[79] JDK 9: https://openjdk.java.net/jeps/248

[80] JDK 15: https://openjdk.java.net/jeps/379

[81] JDK 14: https://openjdk.java.net/jeps/365

[82] JDK 14: https://openjdk.java.net/jeps/364

[83] JDK 11: https://openjdk.java.net/jeps/333

[84] JDK 15: https://openjdk.java.net/jeps/377

[85] JDK 12: https://openjdk.java.net/jeps/189

[86] JDK 11: https://openjdk.java.net/jeps/318

[87] JDK 10: https://openjdk.java.net/jeps/316

[88] API: https://cr.openjdk.java.net/~egahlin/jep-349/javadocs/api/jdk.jfr/jdk/jfr/consumer/package-summary.html

[89] JDK 14: https://openjdk.java.net/jeps/349

[90] JDK 12: https://openjdk.java.net/jeps/230

[91] JDK 11: https://openjdk.java.net/jeps/328

[92] JDK 11: https://openjdk.java.net/jeps/331

[93] JDK 9: https://openjdk.java.net/jeps/165

[94] JDK 9: https://openjdk.java.net/jeps/158

[95] JDK 9: https://openjdk.java.net/jeps/271

[96] JDK 9: https://openjdk.java.net/jeps/264

[97] JDK 10: https://openjdk.java.net/jeps/319

[98] JDK 9: https://openjdk.java.net/jeps/290

[99] JDK 9.: https://openjdk.java.net/jeps/229

[100] JDK 9 на: https://openjdk.java.net/jeps/273

[101] JDK 9: https://openjdk.java.net/jeps/288

[102] JDK 9: https://openjdk.java.net/jeps/287

[103] JDK 11: https://openjdk.java.net/jeps/332

[104] JDK 9: https://openjdk.java.net/jeps/219

[105] JDK 9: https://openjdk.java.net/jeps/249

[106] JDK 9: https://openjdk.java.net/jeps/244

[107] RFC8032: https://tools.ietf.org/html/rfc8032

[108] JDK 15: https://openjdk.java.net/jeps/339

[109] JDK 11: https://openjdk.java.net/jeps/324

[110] JDK 11: https://openjdk.java.net/jeps/329

[111] JDK 11: https://openjdk.java.net/jeps/330

[112] JDK 9: https://openjdk.java.net/jeps/222

[113] Создание прототипов с помощью JShell: https://advancedweb.hu/prototyping-with-jshell/

[114] JDK 9: https://openjdk.java.net/jeps/247

[115] JDK 9: https://openjdk.java.net/jeps/245

[116] JDK 14: https://openjdk.java.net/jeps/343

[117] JDK 9: https://openjdk.java.net/jeps/282

[118] 2: https://openjdk.java.net/jeps/220

[119] 3: https://openjdk.java.net/jeps/275

[120] 4: https://openjdk.java.net/jeps/200

[121] 4: https://openjdk.java.net/jeps/201

[122] 5: https://openjdk.java.net/jeps/260

[123] JDK 9: https://openjdk.java.net/jeps/238

[124] JDK 9: https://openjdk.java.net/jeps/225

[125] 2: https://openjdk.java.net/jeps/224

[126] 3: https://openjdk.java.net/jeps/221

[127] JDK 15: https://openjdk.java.net/jeps/371

[128] JDK 12: https://openjdk.java.net/jeps/334

[129] JDK 11: https://openjdk.java.net/jeps/309

[130] JDK 11: https://openjdk.java.net/jeps/181

[131] JDK 9: https://openjdk.java.net/jeps/280

[132] JDK 9: https://openjdk.java.net/jeps/276

[133] JDK 9: https://openjdk.java.net/jeps/237

[134] JDK 9: https://openjdk.java.net/jeps/294

[135] JDK 9: https://openjdk.java.net/jeps/297

[136] JDK 9 : https://openjdk.java.net/jeps/223

[137] JDK 10: https://openjdk.java.net/jeps/322

[138] JDK 15: https://openjdk.java.net/jeps/372

[139] JDK 11: https://openjdk.java.net/jeps/335

[140] JDK 15: https://openjdk.java.net/jeps/381

[141] JDK 14: https://openjdk.java.net/jeps/362

[142] активация RMI: https://docs.oracle.com/javase/9/docs/specs/rmi/activation.html

[143] JDK 15: https://openjdk.java.net/jeps/385

[144] предвзятая блокировк: https://stackoverflow.com/questions/9439602/biased-locking-in-java

[145] JDK 15: https://openjdk.java.net/jeps/374

[146] JDK 14: https://openjdk.java.net/jeps/363

[147] JDK 14: https://openjdk.java.net/jeps/366

[148] JDK 14: https://openjdk.java.net/jeps/367

[149] JDK 11: https://openjdk.java.net/jeps/336

[150] JDK 11: https://openjdk.java.net/jeps/320

[151] JDK 11: https://bugs.openjdk.java.net/browse/JDK-8204243

[152] JDK 10: https://openjdk.java.net/jeps/313

[153] 2: https://openjdk.java.net/jeps/253

[154] JDK 9: https://openjdk.java.net/jeps/231

[155] JDK 9: https://openjdk.java.net/jeps/241

[156] JDK 9: https://openjdk.java.net/jeps/240

[157] JDK 9: https://openjdk.java.net/jeps/214

[158] JDK 9: https://openjdk.java.net/jeps/289

[159] JDK 9: https://openjdk.java.net/jeps/291

[160] JDK 9: https://bugs.openjdk.java.net/browse/JDK-8165641

[161] JDK 9: https://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-A78CC891-701D-4549-AA4E-B8DD90228B4B

[162] Java Almanac: https://github.com/marchof/java-almanac

[163] jdeps: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html

[164] JDK 8: https://openjdk.java.net/projects/jdk8/

[165] Источник: https://habr.com/ru/post/521988/?utm_source=habrahabr&utm_medium=rss&utm_campaign=521988