Каталог столбцов
- Пришло время обновить преимущества java11-01-jdk11 и опции jdk
- Пора обновить java11-02-Upgrade jdk11 и шагнуть на яму
- Пришло время обновить настройки параметров JVM виртуальной машины java11-03
- Пришло время обновить java11-04 http2 Clear Text (h2c) для связи http2 в микросервисах.
- Пришло время обновить java11 - 05 Препятствие и решение проблем связи h2c внутри микросервисов
Коммерческие расходы Java8
Начиная с января 2019 года, Oracle JDK начал взимать коммерческую плату за версии после Java SE 8, а точнее за версии после 8u201/202. Если вы разрабатываете функцию на Java для коммерческого использования и не хотите платить за нее, последней версией, которую можно использовать бесплатно, будет 8u201/202. Конечно, если вы являетесь индивидуальным клиентом или индивидуальным разработчиком, вы можете бесплатно попробовать все версии Oracle JDK.
Улучшения производительности в Java 11
Простой переход на Java 11 дает улучшение на 16%, что, вероятно, связано с введением JEP 307: Parallel Full GC для G1 в Java 10.
Подробнее см.Насколько быстрее Java 11, чем 8? Проверьте этот тест
Краткий обзор изменений с Java 8 на Java 11
инструкция: Мы не будем представлять здесь все функции, а лишь перечислим некоторые изменения, которые больше всего волнуют разработчиков.
компактная строка
Начиная с Java 9 перенос данных String был изменен с char[] на byte[] Компактная строка, которая во многих случаях содержит только символы Latin-1, что может сэкономить половину памяти.
расширенный API
1. Улучшение строк с 11 лет
// 判断字符串是否为空白
" ".isBlank(); // true
// 去除首尾空格
" Hello Java11 ".strip(); // "Hello Java11"
// 去除尾部空格
" Hello Java11 ".stripTrailing(); // " Hello Java11"
// 去除首部空格
" Hello Java11 ".stripLeading(); // "Hello Java11 "
// 复制字符串
"Java11".repeat(3); // "Java11Java11Java11"
// 行数统计
"A\nB\nC".lines().count(); // 3
2. Расширение коллекции
Начиная с Java 9, методы of и copyOf были добавлены к коллекциям (List, Set, Map) в jdk. Они используются для создания неизменяемых коллекций.
- of() @since 9
- copyOf() @since 10
Пример первый:
var list = List.of("Java", "Python", "C"); //不可变集合
var copy = List.copyOf(list); //copyOf判断是否是不可变集合类型,如果是直接返回
System.out.println(list == copy); // true
var list = new ArrayList<String>(); // 这里返回正常的集合
var copy = List.copyOf(list); // 这里返回一个不可变集合
System.out.println(list == copy); // false
Пример второй:
var set = Set.of("Java", "Python", "C");
var copy = Set.copyOf(set);
System.out.println(set == copy); // true
var set1 = new HashSet<String>();
var copy1 = List.copyOf(set1);
System.out.println(set1 == copy1); // false
Пример третий:
var map = Map.of("Java", 1, "Python", 2, "C", 3);
var copy = Map.copyOf(map);
System.out.println(map == copy); // true
var map1 = new HashMap<String, Integer>();
var copy1 = Map.copyOf(map1);
System.out.println(map1 == copy1); // false
Примечание. Коллекция, созданная с помощью of и copyOf, является неизменяемой коллекцией, и такие операции, как добавление, удаление, замена, сортировка и т. д., не могут быть выполнены, в противном случае будет сообщено об исключении java.lang.UnsupportedOperationException, а повторяющиеся элементы, Map. of не может появляться при использовании Set.of(). () Не может быть повторяющихся ключей, иначе возвращается java.lang.IllegalArgumentException. .
3. Улучшение потоковой передачи с 9 лет
Stream — это функция Java 8, а в Java 9 к нему добавлено 4 метода:
3.1 ofNullable(T t)
Этот метод может получить значение null для создания пустого потока.
// 以前
Stream.of(null); //报错
// 现在
Stream.ofNullable(null);
3.2 takeWhile(Predicate<? super T> predicate)
Этот метод оценивает в соответствии с интерфейсом Predicate, является ли он истинным, извлекает его для создания нового потока и завершает работу, пока он встречает ложное значение, независимо от того, удовлетворяют ли следующие элементы условиям.
Stream<Integer> integerStream = Stream.of(6, 10, 11, 15, 20);
Stream<Integer> takeWhile = integerStream.takeWhile(t -> t % 2 == 0);
takeWhile.forEach(System.out::println); // 6,10
3.3 dropWhile(Predicate<? super T> predicate)
Этот метод судит в соответствии с интерфейсом Predicate, что, если он истинен, отбросить его, чтобы создать новый поток.Пока он сталкивается с ложным, он завершится, независимо от того, соответствуют ли следующие элементы условиям.
Stream<Integer> integerStream = Stream.of(6, 10, 11, 15, 20);
Stream<Integer> takeWhile = integerStream.dropWhile(t -> t % 2 == 0);
takeWhile.forEach(System.out::println); //11,15,20
3.4повторять перегрузку
Ранее при использовании метода итерации для создания бесконечных потоков требовалось усечение с ограничением.
Stream<Integer> limit = Stream.iterate(1, i -> i + 1).limit(5);
limit.forEach(System.out::println); //1,2,3,4,5
Теперь после перегрузки этот метод добавляет параметр оценки
Stream<Integer> iterate = Stream.iterate(1, i -> i <= 5, i -> i + 1);
iterate.forEach(System.out::println); //1,2,3,4,5
4. Дополнительное улучшение с 9 лет
4.1 stream()
Возвращает пустой поток, если он пуст, и преобразует значение Optional в поток, если он не пуст.
//返回Optional值的流
Stream<String> stream = Optional.of("Java 11").stream();
stream.forEach(System.out::println); // Java 11
//返回空流
Stream<Object> stream = Optional.ofNullable(null).stream();
stream.forEach(System.out::println); //
4.2 ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
Лично я считаю, что этот метод является усовершенствованием Else в сочетании с isPresent(). Цель метода ifPresentOrElse заключается в том, что если необязательное значение содержит значение, действие функции вызывается для содержащегося значения, то есть action.accept( value), что согласуется с ifPresent; и отличие от метода ifPresent заключается в том, что ifPresentOrElse имеет второй параметр emptyAction — если Optional не содержит значения, тогда ifPresentOrElse вызывает emptyAction, который является emptyAction.run().
Optional<Integer> optional = Optional.of(1);
optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() ->
System.out.println("Not Present.")); //Value: 1
optional = Optional.empty();
optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() ->
System.out.println("Not Present.")); //Not Present.
4.3 or(Supplier<? extends Optional<? extends T>> supplier)
Optional<String> optional1 = Optional.of("Java");
Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present");
optional1 = optional1.or( supplierString);
optional1.ifPresent( x -> System.out.println("Value: " + x)); //Value: Java
optional1 = Optional.empty();
optional1 = optional1.or( supplierString);
optional1.ifPresent( x -> System.out.println("Value: " + x)); //Value: Not Present
5. Улучшение InputStream @ с 9
String lxs = "java";
try (var inputStream = new ByteArrayInputStream(lxs.getBytes());
var outputStream = new ByteArrayOutputStream()) {
inputStream.transferTo(outputStream);
System.out.println(outputStream); //java
}
HTTP Client API
Измените API для поддержки как синхронных, так и асинхронных методов. Ниже приведены примеры двух методов:
var request = HttpRequest.newBuilder()
.uri(URI.create("https://www.baidu.com/"))
.build();
var client = HttpClient.newHttpClient();
// 同步
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
// 异步
CompletableFuture<HttpResponse<String>> sendAsync = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
//这里会阻塞
HttpResponse<String> response1 = sendAsync.get();
System.out.println(response1.body());
удалить содержимое
- ком.вс..ну вопрос.. А ВТ утилиты.
- sun.misc.Unsafe.defineClass Вместо этого используйте java.lang.invoke.MethodHandles.Lookup.defineClass.
- Методы Thread.destroy() и Thread.stop(Throwable).
- Свойство sun.nio.ch.disableSystemWideOverlappingFileLockCheck.
- свойство sun.locale.formata по умолчанию.
- jdk snmp-модуль.
- javafx, openjdk был удален из версии java10, oracle java10 еще не удалил javafx, а версия java11 также удалила javafx.
- Java Mission Control после удаления из JDK необходимо загружать отдельно.
- Корневые сертификаты: Baltimore Cybertrust Code Signing CA, SECOM, AOL и Swisscom.
- Удалены модули Java EE и CORBA, помеченные java9 как устаревшие в java11.
Полная поддержка контейнеров Linux (включая докер)
Многие приложения, работающие на виртуальной машине Java, включая службы данных, такие как Apache Spark и Kafka, а также традиционные корпоративные приложения, могут работать в контейнерах Docker. Но запуск приложения Java в контейнере Docker всегда был проблемой, то есть запуск программы JVM в контейнере приведет к снижению производительности приложения после установки размера памяти и использования ЦП. Это связано с тем, что приложение Java не знает, что оно работает в контейнере. С выпуском Java 10 эта проблема наконец была решена, и JVM теперь может распознавать ограничения, установленные группами управления контейнерами (cgroups). Java-приложениями можно управлять непосредственно в контейнерах, используя ограничения памяти и ЦП, в том числе:
- Соблюдайте лимит памяти, установленный в контейнере
- Установите доступный ЦП в контейнере
- Установка ограничений ЦП в контейнере
Рекомендация JDK
Начиная с Java 11, Oracle предлагает коммерческую версию с платной поддержкой. Здесь автор рекомендует использовать Corretto от Amazon, а Corretto использует протокол GPL.
Долгосрочная поддержка Corretto (LTS) включает улучшения производительности и обновления безопасности для Corretto 8, доступные бесплатно как минимум до июня 2023 года. Обновления планируется выпускать ежеквартально.
Amazon будет предоставлять ежеквартальные обновления LTS для Corretto 11 как минимум до августа 2024 года.
Адрес загрузки с гитхаба:GitHub.com/C или вернуться к /co… GitHub.com/C или вернуться к /co…
утверждение
Эта серия статей подготовленаСлюда основного компонента микросервисаавтортехнология мечтыв соавторстве, Если есть какая-либо ссылка или перепечатка, пожалуйста, сохраните оригинального автора и укажите источник.