Назад
Project Valhalla: десятилітня робота приходить у JDK 28 — що змінює JEP 401
SiTech AI Team3 წთ. საკითხავი

Project Valhalla: десятилітня робота приходить у JDK 28 — що змінює JEP 401

Інженерка Oracle Лоїс Фолтан 15 червня підтвердила, що JEP 401 уже в головному репозиторії OpenJDK і цілиться на JDK 28. Функція надходить як preview, і це лише перша частина проєкту Valhalla.

JEP 401 (Value Classes and Objects) інтегровано в основний репозиторій OpenJDK із ціллю на JDK 28 — це 15 червня підтвердила інженерка Oracle Лоїс Фолтан. Зміна настільки велика, що інших комітерів попросили утриматися від великих правок під час інтеграції: лише цей pull request додає понад 197 тисяч рядків коду у 1 816 файлах.

Функція надходить як preview, вимкнена за замовчуванням, тож працюватиме лише з прапорцем --enable-preview. Браян Гьотц, який рецензував JEP, одразу застеріг від завищених очікувань, назвавши це «лише першою частиною Valhalla».

Проблема: усе є посиланням

Гасло Valhalla від початку звучить так: «кодиться як клас, працює як int». У Java, окрім восьми примітивів, кожне значення є посиланням: змінна тримає вказівник на об'єкт у купі, кожен об'єкт має власний заголовок, і кожен об'єкт потрібно виділити, а згодом зібрати збирачем сміття. Масив на мільйон точок на практиці — це мільйон вказівників на мільйон коробок, розкиданих у пам'яті; такий розклад Браян Гьотц назвав «пухнастим».

Щільність важлива, бо апаратне забезпечення змінювалося швидше за мову: процесор читає пам'ять рядками кеша по 64 байти, тож неперервні дані приходять по кілька значень одразу, а гонитва за вказівниками загрожує промахами кеша, які бувають у сто разів повільнішими за влучання.

Що приносить JDK 28

JEP 401 вводить одне нове поняття: value class, який оголошується модифікатором value, а його екземпляри — це value-об'єкти без ідентичності. Два окремо створені value-об'єкти з однаковими полями взаємозамінні, тому == стає перевіркою взаємозамінності, а не порівнянням адрес, а synchronized на такому типі кидає IdentityException. Value-класи фінальні за замовчуванням, їхні поля неявно final, а методи не можуть бути synchronized; при цьому вони все ще можуть бути null, бо типи без null — окремий, пізніший JEP.

JVM отримує дві оптимізації. Скаляризація дозволяє JIT розкласти value-об'єкт на поля й позбутися виділення пам'яті, а вирівнювання в купі (heap flattening) записує значення безпосередньо в поле або комірку масиву. Вирівняні дані треба читати й записувати атомарно, що сьогодні означає приблизно 64 біти разом із прапорцем null, тож частина малих класів усе одно потрапляє в купу. З увімкненим preview власні класи-обгортки JDK, як-от Integer, стають value-класами, що має суттєво здешевити боксінг.

Чого ще немає

Спеціалізованих дженериків у JDK 28 немає. Через стирання типів value-об'єкт у дженерик-колекції все одно матеріалізується в купі, тож ArrayList точок не буде пласким; вирівнювання працює напряму для полів і масивів value-типу. Типи без null, 128-бітні кодування та повністю зрілий JEP 402 про покращений боксінг примітивів — теж робота на майбутнє.

Сам проєкт стартував у 2014 році — Джеймс Гослінг тоді описав його як «шість PhD, зав'язаних в один вузол» — і пройшов через п'ять прототипів, перш ніж набути сучасної форми. JDK 28 не є релізом з довготривалою підтримкою: він запланований на березень 2027 року, а наступний LTS, імовірно, буде JDK 29 у вересні 2027-го. Early-access збірки вже доступні на jdk.java.net/valhalla.

SSiTech

SiTech — веброзробка з підтримкою AI

Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.