Релиз-кандидат JDK 12: Shenandoah, G1, JMH, Arm64. Баги в Swing наносят ответный удар

240 дней прошло с момента выпуска JEP 3: JDK Release Process и адская машина по производству новых версий останавливаться не желает. А значит, настало время очередного релиз-кандидата. Это период, когда все мосты сожжены, баги с приоритетами P2-P5 уже ничего не значат, и дни до релиза сочтены.

rmlslczx_0wk26jxxrrs85wt380.png

Не все баги с приоритетом P1 закрыты. Ознакомиться с полным списком проблем можно в багтрекре. И тут нас ожидает самое странное: все они относятся строго к Swing при использовании GTKLookAndFeel.

Уже мысленно сказали: «Да что с этими ребятами в Свинге не так?». На этот раз «виноваты» не они. Если кто вдруг не знает, Gtk — это свободный тулкит для разработки графических интерфейсов, особенно на операционной системе GNU/Linux для X11 и Wayland.

Начиная с Gtk 3.20, у них поменялся способ работы со многими стилями и виджетами. Вместо классов стилей и имен типов теперь используются имена элементов. Gtk 3.20 вышел 21 марта 2016 года, и это был очень масштабный релиз — 28933 коммита и Wayland по умолчанию. Вообще, весь Gnome стал выглядеть слегка по-другому.

c8480aaf1fd309a44e9290faa2c3b58d.png

Неудивительно, что в Swing могли кое-что забыть и не протестировать. Часть багов сдвинули в приоритете на P2 и перенесли на JDK 13. Например, вот этот баг про то, что Motif в MacOS, как бы помягче сказать, более не является столь актуальной графической средой:

dta50prbuqzx19le5beowsqkuy0.png

Будет забавно, если на Хабре кто-то действительно всё ещё использует Motif и AWT. Надеюсь, двенадцатый JDK не отменят из-за этого, иначе это будет самый эпический фейл в джаве за всю её молодую новую релизную историю.

JEP-ы в этом списке будут перечислены не по важности, а исключительно по порядковому номеру. Это чтобы вы вдруг не подумали, что Шенанда и JMH попали наверх из-за личных симпатий.

189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)

Неплохо бы, чтобы оно произошло ещё год назад и Шенанда попала в LTS. Ладно, дождались — и на том спасибо. Shenandoah — это низкопаузный коллектор, добивающийся своей низкопаузности за счёт многопоточной фазы эвакуации. Причем от размера хипа паузы не зависят, поэтому можно смело ворочить терабайтными хипами на проде.

230: Microbenchmark Suite

В JDK добавляется набор тестов, основанный на JMH, да и сам JMH тоже. Лежит в jdk/jdk/test/micro/org/openjdk/bench. JMH — это фреймворк для создания, сборки, запуска и анализа микробенчмарков для Java и других JVM-языков, написанный сами понимаете кем. JMH сейчас де-факто является стандартом для микробенчмарков, и появление подобных JEP-ов — вопрос времени.

325: Switch Expressions (Preview)

Вместо тысячи описаний:

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

334: JVM Constants API

Цель в том, чтобы предоставить набор типов для формального моделирования описаний классов, методов и других сущностей в рантайме и классфайле, и натянуть их на основные классы вроде String или Class. Они живут в пакетах вроде java.lang.invoke.constant и есть не просят, а на сам патч можно взглянуть здесь.

340: One AArch64 Port, Not Two

Старый порт arm64 выброшен на мороз, а вот 32-битный ARM и aarch64 — активно пилятся. За существование этих портов нужно благодарить компанию BellSoft (кстати, офис этой компании расположен в Питере, рядом с бывшим офисом компании Oracle). К релизу JDK 12 мы постараемся получить от представителей компании более развёрнутый комментарий.

341: Default CDS Archives

Как фича, CDS нам был давно доступен, но было непонятно, зачем каждый раз самостоятельно писать -Xshare:dump, если дефолтный результат выполнения этой команды немножко предсказуем ещё на этапе создания дистрибутива JDK. Эту досадную оплошность починят в JDK 12, архив CDS будет генериться создателями дистрибутива, даже для ночных билдов (при условии что они 64-битные и нативные, не для кросс-компиляции).

344: Abortable Mixed Collections for G1

Эта фича нужна внутренним механизмам сборщика мусора G1, чтобы он чаще укладывался в требования по продолжительности паузы. Бывает так, что можно определить, когда G1 раз за разом неправильно оценивает сложность сборки, особенно для старых регионов. В этот момент можно испугаться, и начать собирать инкрементально, шаг за шагом, и после каждого шага иметь возможность сборку прервать. Утверждается, что это позволит лучше укладываться в ожидаемое время сборки.

346: Promptly Return Unused Committed Memory from G1

Сейчас G1 отдаёт commited память операционной системе или при full GC, или при параллельной сборке. И то и другое G1 всячески пытается избежать, за что ему спасибо. Но это же означает, что память пожирается как не в себя, и заставить G1 исторгнуть память обратно можно только каким-то внешним способом. Особенно это печально для всяких докеров и прочих хипстеров без терабайтов оперативной памяти на сервере. Вместо этого предлагается делать так же, как уже умеет Шенанда или GenCon из OpenJ9 — определять недостаточную утилизацию хипа и соответственно уменьшать его использование. На каких-то тестах на Томкате это позволило уменьшить расход памяти почти в два раза.

Это был обзор по верхам, а подробный разбор фич постараемся сделать ближе к релизу в виде отдельных статей — переводов JEP-ов, скринкастов с бенчмарками, или ещё чего-то такого. Теперь надо ждать релиза, который намечен на 19 марта.


Минутка рекламы. Совсем скоро, 5–6 апреля, пройдёт конференция JPoint, на которой соберётся огромное количество людей, знающих толк в JDK и всевозможных новых фичах. Самое правильное место, чтобы обсудить свежий релиз! Подробней о JPoint можно узнать на официальном сайте.

© Habrahabr.ru