- PVSM.RU - https://www.pvsm.ru -
Последнее обновление: 29.09.2020, вклющее изменения до JDK 15 [1] .
С момента выпуска версии 8 до версии 15 Java формируется 163 предложениями по расширению JDK [2] (JEP), каждое из которых вносит некоторые улучшения в платформу. Эта страница представляет собой систематизированный и тщательно подобранный список наиболее важных улучшений.
Содержание
Новые языковые функции
Новые 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()
};
Записи ( Превью)
record Point(int x, int y) { }
Сопоставление с образцом для instanceof (Предварительный просмотр)
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]
Давайте продолжим со Стандартной библиотекой 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());
Усовершенствования строк - методы: isBlank
, lines
, repeat
и 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]
Больше возможностей для преобразования ( dropWhile
, takeWhile
) и генерации ( iterate
, ofNullable
) потоков; сборщики только для чтения ( toUnmodifiableList
); опции могут быть преобразованы в потоки
JDK 9 [34]
Arrays.mismatch
: найти первый несовпадающий элемент между двумя массивами
JDK 9 [35]
Stack-Walking API, который позволяет использовать ленивый подход и фильтрацию кадров
JDK 9 [36]
API процессов предоставляет дополнительную информацию и контроль (например, идентификатор процесса, аргументы, время ЦП, родительские / дочерние процессы), а также улучшения ProcessBuilder
помогающие создавать конвейеры процессов
JDK 9 [37]
VarHandle
API для замены операций, связанных с полями и массивами, 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
sin
, cos
и 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]
Распределение памяти с учетом 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=<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 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 теперь генерирует разметку 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]
Удалена 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
Нажмите здесь для печати.