Серия функций языка Java
- Новые возможности Java5
- Новые возможности Java6
- Новые возможности Java7
- Новые возможности Java8
- Новые возможности Java9
- Что нового в Java 10
- Что нового в Java 11
- Новые функции в Java 12
- Новые функции в Java 13
последовательность
В этой статье в основном описываются новые функции Java 12.
номер версии
java -version
openjdk version "12" 2019-03-19
OpenJDK Runtime Environment (build 12+33)
OpenJDK 64-Bit Server VM (build 12+33, mixed mode)
Из информации о версии видно, что это сборка 12+33.
Список функций
Shenandoah GC — сборщик мусора для low-pause-time, изначально реализован Red Hat и поддерживает архитектуру aarch64 и amd64, ZGC — тоже сборщик мусора для low-pause-time, но ZGC основан на цветных указателях. реализован на основе указателей ручьев; если вы хотите использовать Shenandoah GC, вам нужно скомпилировать с параметром --with-jvm-features с shenandoahgc, а затем использовать -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC при запуске
В исходный код jdk добавлен новый набор базовых наборов микробенчмарков.
Переключатель был улучшен. В дополнение к оператору использования можно также использовать выражение. Например, исходное написание выглядит следующим образом:
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}
Теперь это можно записать следующим образом:
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
и возвращаемое значение в выражении
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
Для выражения переключения, которое должно возвращать значение, оно либо возвращает нормальное значение, либо выдает исключение, оба следующих утверждения неверны.
int i = switch (day) {
case MONDAY -> {
System.out.println("Monday");
// ERROR! Block doesn't contain a break with value
}
default -> 1;
};
i = switch (day) {
case MONDAY, TUESDAY, WEDNESDAY:
break 0;
default:
System.out.println("Second half of the week");
// ERROR! Group doesn't contain a break with value
};
Добавлен API констант JVM, в частности, модуль java.base добавил пакет java.lang.constant и представил интерфейс ConstantDesc (
ClassDesc、MethodTypeDesc、MethodHandleDesc这几个接口直接继承了ConstantDesc接口
) и интерфейс Constable; интерфейс ConstantDesc определяет метод resolveConstantDesc, а интерфейс Constable определяет методscribeConstable; String, Integer, Long, Float и Double реализуют эти два интерфейса, а EnumDesc реализует интерфейс ConstantDesc.
64-битная платформа Arm (arm64), также известная как aarch64; до того, как в JDK было две реализации aarch64, src/hotspot/cpu/arm и open/src/hotspot/cpu/aarch64, их реализации повторялись Теперь, чтобы сконцентрироваться на лучшей реализации aarch64, эта функция удаляет 64-битную реализацию в open/src/hotspot/cpu/arm из исходного кода и сохраняет 32-битную реализацию, поэтому open/src/hotspot/ Часть cpu/aarch64 становится стандартной реализацией 64-битной архитектуры ARM.
Новые возможности java10JEP 310: Application Class-Data SharingРасширяет совместное использование данных классов, введенное в JDK5, и поддерживает совместное использование данных классов приложений; совместное использование данных классов может использоваться для нескольких JVM для совместного использования классов и повышения скорости запуска. В самом начале поддерживались только системные классы и последовательный сборщик мусора , JDK9 расширил его для поддержки классов приложений и других алгоритмов GC, а также с открытым исходным кодом в JDK10 (
以前是commercial feature
); JDK11 изменил -Xshare:off на значение по умолчанию -Xshare:auto, чтобы упростить использование функции CDS; эта функция JDK12 по умолчанию находится в каталоге ${JAVA_HOME}/lib/server при компиляции jdk на 64-разрядном компьютере. битовая платформа Затем создается файл архива по умолчанию с именем class.jsa (大概有18M
) удобен в использовании для всех
Когда G1 находится в сборке мусора, как только набор сбора определен (
CSet
) Процесс запуска сборки мусора не останавливается, когда набор для сбора слишком велик, время STW будет слишком большим, чтобы превысить целевое время паузы, что более очевидно в смешанных сборках. Эта функция запускает механизм, который при выборе большего набора коллекций позволяет разделить его на обязательные и необязательные части (当完成mandatory的部分,如果还有剩余时间则会去处理optional部分
), чтобы изменить смешанные коллекции с без остановки на прерываемые, чтобы лучше соответствовать цели указания времени паузы
В настоящее время G1 возвращает память только во время полного GC или параллельного цикла.Поскольку G1 избегает этих двух сценариев, в большинстве сценариев память кучи Java может не быть зафиксирована в операционной системе вовремя. Эта функция JDK12 добавляет два новых параметра, G1PeriodicGCInterval и G1PeriodicGCSystemLoadThreshold.Если установлено значение 0, это означает, что отключено. Когда прошла последняя пауза сборки мусора G1PeriodicGCInterval(
milliseconds
) время, если getloadavg()(one-minute
) ниже, чем порог, указанный G1PERIDICGCSYSTEMLOCTTHRESHOLD, триггер полного GC или одновременно GC (如果开启G1PeriodicGCInvokesConcurrent
), размер кучи Java будет перезаписан и скорректирован после сборки мусора, а лишняя память будет возвращена операционной системе.
Подробная интерпретация
Выше перечислены основные функции, в дополнение к некоторым обновлениям и отказам API, в основном см.JDK 12 Release Notes, Вот несколько примеров.
Добавьте предмет
- Поддержка юникода 11
- Поддержка компактного форматирования чисел
Примеры использования следующие
@Test
public void testCompactNumberFormat(){
var cnf = NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.SHORT);
System.out.println(cnf.format(1_0000));
System.out.println(cnf.format(1_9200));
System.out.println(cnf.format(1_000_000));
System.out.println(cnf.format(1L << 30));
System.out.println(cnf.format(1L << 40));
System.out.println(cnf.format(1L << 50));
}
вывод
1万
2万
100万
11亿
1兆
1126兆
- Строка поддерживает операции преобразования и отступа.
@Test
public void testStringTransform(){
System.out.println("hello".transform(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return s.hashCode();
}
}));
}
@Test
public void testStringIndent(){
System.out.println("hello".indent(3));
}
- Файлы добавляют метод несоответствия
@Test
public void testFilesMismatch() throws IOException {
FileWriter fileWriter = new FileWriter("/tmp/a.txt");
fileWriter.write("a");
fileWriter.write("b");
fileWriter.write("c");
fileWriter.close();
FileWriter fileWriterB = new FileWriter("/tmp/b.txt");
fileWriterB.write("a");
fileWriterB.write("1");
fileWriterB.write("c");
fileWriterB.close();
System.out.println(Files.mismatch(Path.of("/tmp/a.txt"),Path.of("/tmp/b.txt")));
}
- Коллекторы добавляют метод тройника для агрегирования результатов двух нисходящих потоков.
@Test
public void testCollectorTeeing(){
var result = Stream.of("Devoxx","Voxxed Days","Code One","Basel One")
.collect(Collectors.teeing(Collectors.filtering(n -> n.contains("xx"),Collectors.toList()),
Collectors.filtering(n -> n.endsWith("One"),Collectors.toList()),
(List<String> list1, List<String> list2) -> List.of(list1,list2)
));
System.out.println(result.get(0));
System.out.println(result.get(1));
}
- CompletionStage добавляет методы exceptionlyAsync, exceptionlyCompose, exceptionlyComposeAsync.
@Test
public void testExceptionallyAsync() throws ExecutionException, InterruptedException {
LOGGER.info("begin");
int result = CompletableFuture.supplyAsync(() -> {
LOGGER.info("calculate");
int i = 1/0;
return 100;
}).exceptionallyAsync((t) -> {
LOGGER.info("error error:{}",t.getMessage());
return 0;
}).get();
LOGGER.info("result:{}",result);
}
-
До JDK12 у CompletionStage был только один исключительный этап, а тело метода выполнялось в основном потоке.JDK12 добавил методы исключительноAsync иэксклюзивноComposeAsync, чтобы тело метода могло выполняться в асинхронных потоках, и добавил методэксклюзивноCompose для поддержки построения новый CompletionStage в исключительных случаях.
-
Allocation of Old Generation of Java Heap on Alternate Memory Devices
G1 и Parallel GC вводят экспериментальную функцию, позволяющую распределять память старого поколения на альтернативные устройства памяти, такие как память NV-DIMM.
- ZGC: Concurrent Class Unloading
ZGC не поддерживает выгрузку классов в JDK11.JDK12 поддерживает параллельную выгрузку классов для ZGC, которая включена по умолчанию и может быть отключена с помощью -XX:-ClassUnloading
- Добавлен -XX:+ExtensiveErrorReports
-XX:+ExtensiveErrorReports можно использовать для сбора дополнительной информации отчета в файл hs_err.log при сбое jvm.По умолчанию он отключен в сборках продукта.Если вы хотите включить его, вам нужно добавить -XX:+ExtensiveErrorReports параметр себя
- Добавлены улучшения, связанные с безопасностью
Поддержка системного свойства java.security.manager. Если установлено значение Disallow, SecurityManager не используется для повышения производительности. Если в это время вызывается System.setSecurityManager, будет выброшено исключение UnsupportedOperationException Новая опция -groupname для keytool позволяет указать именованную группу при создании пары ключей. Добавлено свойство конфигурации PKCS12 KeyStore для настройки генерации хранилищ ключей PKCS12. Java Flight Recorder добавляет события, связанные с безопасностью Поддержка наборов шифров TLS ChaCha20 и Poly1305
- jdeps Reports Transitive Dependences
Параметры --print-module-deps, --list-deps и --list-reduce-deps jdeps были расширены: добавлены --no-recursive для нетранзитивного анализа зависимостей, --ignore-missing-deps для подавления ошибок отсутствия зависимости
удалить объект
- Удалить com.sun.awt.SecurityWarnin
- Удалите метод финализации FileInputStream, FileOutputStream, Java.util.ZipFile/Inflator/Deflator.
- Удалить глобальный корень GTE CyberTrust
- Удалите поддержку javac -source, -target для 6 и 1.6 и удалите параметр --release.
устаревший
- Список устаревших API см.deprecated-list
- Устаревший параметр -XX:+/-MonitorInUseLists
- Устаревшее значение -keyalg для Keytool по умолчанию.
Известные проблемы
- Swing не поддерживает GTK+ 3.20 и более поздние версии.
- Использование компилятора JVMCI(
比如Graal
), возможности can_pop_frame и can_force_early_return JVMTI отключены
что-то другое
- Если пользователь не указывает user.timezone, а тот, который получен от операционной системы, имеет значение null, начальное значение свойства user.timezone становится нулевым.
- Поведение java.net.URLPermission немного изменилось. Раньше он игнорировал части запроса и фрагмента в URL. На этот раз были добавлены части запроса и фрагмента, а именно
scheme : // authority [ / path ]
изменить наscheme : // authority [ / path ] [ ignored-query-or-fragment ]
- javax.net.ssl.SSLContext API и спецификация имен стандартных алгоритмов безопасности Java удаляют требование для реализации TLSv1 и TLSv1.1
резюме
- java12 не LTS (
Long-Term Support
)Версия(oracle版本才有LTS
), цикл поддержки Oracle для этой версии составляет 6 месяцев. Эта версия в основном имеет несколько точек обновления: одна — обновление уровня синтаксиса, другая — обновление уровня API, а третья — в основном обновление GC. - Уровень синтаксиса представляет предварительную версию Switch Expressions, уровень API представляет API констант JVM, вводит формат CompactNumberFormat, позволяет NumberFormat поддерживать COMPACTSTYLE и добавляет новые методы в String, Files, Collectors, CompletionStage и т. д. экспериментальная версия Shenandoah GC, но сборка openjdk oracle не включает поддержку Shenandoah GC, кроме того, она в основном улучшает ZGC и G1 GC
- Среди них JDK12 поддерживает параллельную выгрузку классов для ZGC, которая включена по умолчанию и может быть отключена с помощью -XX:-ClassUnloading; для G1 GC он поддерживает функции Abortable Mixed Collections и Promptly Return Unused Committed Memory.
doc
- openjdk 12
- JDK 12 Release Notes
- Java 12 Released with Experimental Switch Expressions and Shenandoah GC
- Definitive Guide To Java 12
- Definitive Guide To Switch Expressions In Java 12
- JVM Class Data Sharing
- JEP 310: Application Class-Data Sharing
- Improve Launch Times On Java 10 With Application Class-Data Sharing
- Make -Xshare:auto the default for server VM
- Using application class-data sharing
- Java Performance Tuning News February 2018
- JDK 12 Security Enhancements