۱۴۰۵ مهر ۶, دوشنبه
دلار آمریکا۲۴۳٬۴۱۵▲ ۳٫۵۸٪یورو۲۷۷٬۰۰۰▲ ۳٫۳۹٪درهم امارات۶۶٬۳۰۵▲ ۳٫۶۱٪سکه امامی۲۴۴٬۵۰۵٬۰۰۰▲ ۱٫۶۶٪طلای ۱۸ عیار (گرم)۲۴٬۳۱۹٬۰۰۰▲ ۱٫۷۵٪انس طلا۴٬۱۵۰ $▼ ۳٫۲۶٪تتر۲۴۴٬۴۵۶▲ ۳٫۲۴٪بیت‌کوین۸۲٬۶۵۳ $▼ ۲٫۴۱٪اتریوم۲٬۶۴۰ $▼ ۱٫۸۹٪سولانا۱۱۷٫۸۴ $▼ ۴٫۳۴٪اپل۳۴۱٫۰۷ $▲ ۱٫۵۳٪انویدیا۲۲۵٫۰۷ $▲ ۰٫۲۲٪مایکروسافت۵۱۶٫۱۷ $▲ ۳٫۶۶٪آلفابت (گوگل)۳۴۳٫۹۲ $▲ ۰٫۴۶٪تسلا۳۷۲٫۱۱ $▼ ۱٫۵۴٪شاخص نزدک۲۷٬۰۶۹ $▲ ۰٫۴۸٪
نرخ ارز

Java 27 منتشر شد؛ G1 همه‌جا پیش‌فرض و TLS پساکوانتومی

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

برنامه‌نویسی۳ دقیقه مطالعه
Java 27 منتشر شد؛ G1 همه‌جا پیش‌فرض و TLS پساکوانتومی
فهرست مطالب
  1. Java 27 چه چیزهایی آورده است؟
  2. G1 دیگر رقیب ندارد
  3. هدر اشیا لاغرتر شد
  4. TLS 1.3 برای دوران پساکوانتومی
  5. پیش‌نمایش‌ها: همروندی ساخت‌یافته هنوز در راه است
  6. ارتقا به Java 27 لازم است؟

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 در دسترس‌اند و توزیع‌کنندگان دیگر هم به‌زودی نسخه‌های خود را منتشر می‌کنند.

مطالب مرتبط