Java 27 منتشر شد؛ G1 همهجا پیشفرض و TLS پساکوانتومی
Java 27 با ۹ JEP رسماً منتشر شد: G1 در همه محیطها پیشفرض است، هدرهای فشرده اشیا فعال شده و TLS 1.3 تبادل کلید پساکوانتومی گرفته است.

فهرست مطالب
Java 27 روز ۱۵ سپتامبر ۲۰۲۶ (۲۴ شهریور ۱۴۰۵) به مرحله انتشار عمومی (GA) رسید. این نسخه ۹ پیشنهاد بهبود (JEP) دارد که چهارتای آنها پیشنمایش و یکی انکوباتور است. مهمترین تغییرها زیر پوست JVM اتفاق افتادهاند: G1 حالا در همه محیطها جمعآوریکننده زباله پیشفرض است و هدرهای فشرده اشیا بهطور پیشفرض روشن شدهاند.
به گفته Inside.java، JDK 27 هجدهمین نسخهای است که در چرخه انتشار ششماهه سر موعد منتشر شده و ۱۶ درصد اصلاحاتش را توسعهدهندگان مستقل انجام دادهاند.
Java 27 چه چیزهایی آورده است؟
فهرست کامل JEPهای این نسخه طبق صفحه رسمی پروژه OpenJDK:
| JEP | عنوان | وضعیت |
|---|---|---|
| 523 | G1 بهعنوان GC پیشفرض در همه محیطها | نهایی |
| 527 | تبادل کلید ترکیبی پساکوانتومی برای TLS 1.3 | نهایی |
| 534 | هدرهای فشرده اشیا بهصورت پیشفرض | نهایی |
| 536 | حذف دادههای حساس در JFR | نهایی |
| 531 | Lazy Constants | پیشنمایش سوم |
| 532 | انواع اولیه در الگوها، instanceof و switch | پیشنمایش پنجم |
| 533 | Structured Concurrency | پیشنمایش هفتم |
| 538 | کدگذاری PEM برای اشیای رمزنگاری | پیشنمایش سوم |
| 537 | Vector API | انکوباتور دوازدهم |
G1 دیگر رقیب ندارد
تا پیش از این، JVM در محیطهای محدود، یعنی سیستمهایی با یک پردازنده یا حافظه فیزیکی کمتر از ۱۷۹۲ مگابایت، بهطور خودکار Serial GC را انتخاب میکرد. طبق JEP 523، از این به بعد اگر جمعآوریکننده زباله را صریحاً تعیین نکنید، JVM در هر شرایطی سراغ G1 میرود.
استدلال نگهدارندگان JVM این است که G1 از نظر توان عملیاتی، تأخیر و حتی ردپای حافظه به جایی رسیده که میتواند در همه سناریوهای قبلی جای Serial را بگیرد. اگر همچنان Serial را ترجیح میدهید، کافی است آن را در خط فرمان مشخص کنید:
java -XX:+UseSerialGC -jar app.jar
این تغییر برای کانتینرهای کوچک اهمیت ویژهای دارد؛ همانجایی که محدودیت CPU یا حافظه میتوانست JVM را بیسروصدا به سمت Serial ببرد.
هدر اشیا لاغرتر شد
قابلیت هدرهای فشرده (Compact Object Headers) اول در JDK 24 با JEP 450 معرفی شد و در JDK 25 به قابلیت محصول رسید. حالا JEP 534 آن را پیشفرض کرده است: هدر هر شیء روی معماریهای ۶۴ بیتی از ۹۶ بیت به ۶۴ بیت کاهش پیدا میکند.
عددهایی که خود JEP گزارش کرده چشمگیرند: در بنچمارک SPECjbb2015، مصرف هیپ ۲۲ درصد و زمان CPU هشت درصد کمتر شده و تعداد جمعآوری زباله در G1 و Parallel، ۱۵ درصد کاهش یافته است. طبق همین سند، آمازون این قابلیت را در صدها سرویس عملیاتی به کار گرفته است. برای برگشت به چیدمان قدیمی:
java -XX:-UseCompactObjectHeaders -jar app.jar
TLS 1.3 برای دوران پساکوانتومی
JEP 527 سه طرح تبادل کلید ترکیبی را به TLS 1.3 اضافه میکند که ML-KEM را با ECDHE کلاسیک ترکیب میکنند: X25519MLKEM768، SecP256r1MLKEM768 و SecP384r1MLKEM1024. از این میان فقط X25519MLKEM768 بهطور پیشفرض فعال است و در صدر فهرست ترجیح قرار میگیرد.
ایده ترکیبی ساده است: حتی اگر روزی یکی از دو الگوریتم شکسته شود، دیگری از ارتباط محافظت میکند. این کار بر پایه KEM API در Java 21 و الگوریتم ML-KEM در Java 24 ساخته شده است. برای تنظیم دستی گروهها میتوانید از ویژگی سیستمی jdk.tls.namedGroups یا متد SSLParameters::setNamedGroups() استفاده کنید.
پیشنمایشها: همروندی ساختیافته هنوز در راه است
Structured Concurrency با JEP 533 هفتمین پیشنمایش خود را پشت سر میگذارد. در این دور، متد awaitAll() حذف شده، onTimeout() جای خود را به timeout() داده و متدهای کارخانهای Joiner در صورت شکست، ExecutionException پرتاب میکنند. نمونه پایهای که خود JEP آورده است:
Response handle() throws ExecutionException, InterruptedException {
try (var scope = StructuredTaskScope.open()) {
Subtask<String> user = scope.fork(() -> findUser());
Subtask<Integer> order = scope.fork(() -> fetchOrder());
scope.join(); // Join subtasks, propagating exceptions
return new Response(user.get(), order.get());
}
}
برای اجرای این کد باید پیشنمایش را با --enable-preview فعال کنید. JEP 536 هم امکان حذف آرگومانهای حساس خط فرمان و متغیرهای محیطی از ضبطهای Flight Recorder را فراهم میکند؛ قابلیتی کوچک اما کاربردی برای تیمهایی که فایلهای JFR را با دیگران به اشتراک میگذارند.
ارتقا به Java 27 لازم است؟
Java 27 نسخه کوتاهمدت است و طبق اعلام اوراکل، بهروزرسانیهایش تا مارس ۲۰۲۷ و آمدن JDK 28 ادامه دارد. آخرین نسخه پشتیبانی بلندمدت (LTS) همچنان Java 25 است، پس برای سیستمهای عملیاتی فشاری برای مهاجرت وجود ندارد.
با این حال، اجرای تستها روی JDK 27 ایده خوبی است؛ بهخصوص اگر سرویسهایتان در کانتینرهای کوچک اجرا میشوند و تغییر GC پیشفرض ممکن است رفتار حافظه را عوض کند. اگر هنوز بین زبانهای بکاند مردد هستید، مقایسه عملی Rust و Go را هم بخوانید. باینریهای رسمی از jdk.java.net در دسترساند و توزیعکنندگان دیگر هم بهزودی نسخههای خود را منتشر میکنند.



