JDK 12: Новите функции в Java 12

Продукцията на Java Development Kit 12, базирана на Java SE (Standard Edition) 12, вече е налична. Компилациите JDK 12 се предлагат от Oracle за Linux, Windows и MacOS. 

Къде да изтеглите JDK 12

Можете да изтеглите JDK 12 от уеб сайта на Java.net.

Компилациите с отворен код се предоставят под GNU General Public License v2, с Classpath Exception. Търговските версии на JDK 12 от Oracle могат да бъдат намерени в мрежата на Oracle Technology под лиценз без отворен код.

Нови функции в Java 12

Колектор за боклук Шенандоа

Java 12 добавя Shenandoah, експериментален алгоритъм за събиране на боклука, за да намали времето за пауза при събиране на боклука, като извършва евакуационна работа едновременно със стартиране на Java нишки. Shenandoah предоставя подходящ алгоритъм за приложения, които ценят отзивчивостта и предсказуемите кратки паузи. Намерението обаче не е да коригира всички проблеми с паузата на JVM.

Понастоящем Red Hat поддържа Shenandoah в архитектурите Aarch64 и AMD64.

Смесени колекции за събиране на боклук G1

Java 12 прави G1 смесени колекции прекратими, ако те могат да надхвърлят целта на пауза. Целта на G1 беше да изпълни зададеното от потребителя време за пауза за своите паузи за събиране.

Преди това усъвършенстван механизъм за анализ избираше количеството работа, която трябва да бъде извършена по време на събиране. Резултатът беше набор от региони, известни като набор за събиране. След като наборът беше определен и започна събирането, G1 събра всички живи обекти в регионите на колекциите във всички региони, без да спира. Но това може да доведе до надвишаване на целта за време на пауза, ако евристиката на приложението избере твърде голям набор от колекции.

Необходим е механизъм за откриване, когато евристиката многократно е избрала неправилно количество работа за колекции и, ако това се случи, да накара G1 да извършва поетапно работа по събиране на стъпки, където колекцията може да бъде прекъсната след всяка стъпка. Механизмът, въведен в Java 12, позволява на G1 да постига целта за време на пауза по-често.

Бързо връщане на неизползвана ангажирана памет

Java 12 подобрява G1, за да връща автоматично паметта на Java в операционната система в неактивен режим. Тази памет се освобождава в разумен период от време, когато има много ниска активност на приложението.

Преди това G1 връщаше паметта от купчината или при пълно събиране на боклук, или по време на едновременен цикъл. С G1, който се опитва да избегне пълното събиране на боклука, само задействайки едновременен цикъл, базиран на заетостта на купчината и разпределението, той няма да върне паметта на купчина в много случаи, освен ако не бъде принуден да прави това външно. Това поведение беше неблагоприятно в контейнерни среди, където ресурсите се плащат чрез използване. Дори когато JVM използва само част от определената му памет поради неактивност, G1 запазва пълната купчина. Така че клиентите плащаха през цялото време за всички ресурси и доставчиците на облак не можеха да използват пълноценно своя хардуер.

С Java 12 JVM може да открива фази на недостатъчно използване на купчината и автоматично да намалява използването на купчината през това време. 

API на JVM константи

Този API моделира номинални описания на ключови класове на файлове и артефакти по време на изпълнение, особено константи, които могат да бъдат заредени от константния пул. Java 12 дефинира семейство от базирани на стойност символни референтни типове в нов пакет java.lang.invoke.constant, за да опише всеки вид зареждаема константа.

Постоянни пулове съществуват във всеки клас на Java, съхраняващи операнди и инструкции за байт код в класа. Записите в константния пул описват или артефакти по време на изпълнение като класове и методи, или прости стойности като низове и цели числа. Тези записи са известни като зареждащи се константи.

Програмите, които манипулират файлове с класове, трябва да моделират инструкции за байт код и на свой ред константи за зареждане. Но използването на стандартни типове Java за моделиране на зареждащи се константи е недостатъчно. Това може да е приемливо за зареждаема константа, която описва низ, но е проблематично за зареждаема константа, която описва клас, тъй като създаването на „жив” Classобект разчита на коректността и последователността на зареждането на класа. Зареждането на класа обаче има много екологични зависимости и режими на повреда.

Така че програмите, които се занимават с зареждащи се константи, могат да бъдат опростени, ако могат да манипулират класове и методи и по-малко известни артефакти като манипулатори на методи и динамично изчислени константи в номинална, символична форма. По този начин API на JVM константи дава на библиотеките и инструментите един, стандартен начин за описване на зареждаеми константи.

Подобрено стартиране, CDS и събиране на боклука

Java 12 подобрява процеса на изграждане на JDK, за да генерира архив за споделяне на данни по подразбиране (CDS) по подразбиране, като използва списъка с класове по подразбиране, на 64-битови платформи. Това подобрява времето за стартиране и не е необходимо да се стартира, за -Xshare:dumpда се възползвате от CDS. Процесът на изграждане на JDK е модифициран да се изпълнява java-xshare:dumpслед свързване на изображението.

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

Намален брой ARM портове

Java 12 премахва всички източници, свързани с arm64порта, като същевременно запазва 32-битовата ARM и 64-битова aarch64. Премахването на този порт ще позволи на участниците да съсредоточат усилията си върху една 64-битова реализация на ARM и да елиминират дублиращата се работа, която би се получила от поддържането на два порта. Понастоящем два 64-битови ARM порта са в JDK.

Превключване на изрази

Превключващите изрази опростяват кодирането, като разширяват switchизраза, така че да може да се използва като израз или израз. Това дава възможност както на изрази, така и на изрази да използват „традиционно“ или „опростено“ обхват и да контролират поведението на потока. Тези промени водят до по-просто „ежедневно“ кодиране и подготвят начина за използване на съвпадение на шаблони в switch.

Докато конструкторите на Java се придвижват, за да поддържат съвпадение на шаблони, нередностите в инструкцията на Java  switchсе превърнаха в пречки. Те включват поведението на контролния поток по подразбиране на превключващите блокове; обхват по подразбиране на превключващите блокове, при който блокът се третира като един единствен обхват; и превключвател работи само като изявление. Текущият дизайн на switchизявлението на Java следи отблизо езици като C ++ и по подразбиране поддържа пропадаща семантика. Този контролен поток е полезен за писане на код от ниско ниво. Но когато превключвателят се използва в контексти на по-високо ниво, неговата склонност към грешки започва да надвишава гъвкавостта.

Основен еталонен пакет

JDK 12 включва основен набор от микробенчмарки, които са добавени към изходния код на платформата. Целта е да се улесни разработчиците да изпълняват съществуващи бенчмаркове или да изграждат нови.

Предложението за пакет microbenchmarks, създадено през юли 2014 г. и актуализирано в началото на ноември 2018 г., беше подкрепено от Java Microbenchmark Harness (JMH), за изграждане на бенчмаркове, написани на Java и други JVM езици. Пакетът е колокиран с изходен код на JDK в една директория, като разработчиците могат лесно да добавят нови критерии.

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

Предложението изисква създаването на нова страница на wiki.openjdk.java.net, за да се обясни как да се разработят критерии и да се опишат изискванията. Тези изисквания ще налагат спазване на стандартите за кодиране, възпроизводимите характеристики и документацията.

JDK 12 актуализации

Плановете изискват JDK 12 да получи две актуализации, преди да бъде наследен от JDK 13 след шест месеца. JDK 12 е част от шестмесечната версия на Oracle, въведена с JDK 9 през септември 2017 г. JDK 12 се характеризира като функционална версия, за разлика от JDK 11, която е дългосрочна версия за поддръжка с планирана поддръжка от няколко години.