انتشار پلتفرم Java SE 22 و اجرای مرجع باز OpenJDK 22

پس از شش ماه توسعه، اوراکل جاوا SE 22 (پلتفرم جاوا، نسخه استاندارد 22) را منتشر کرد که از پروژه منبع باز OpenJDK به عنوان پیاده سازی مرجع استفاده می کند. به استثنای حذف برخی از ویژگی‌های منسوخ، Java SE 22 سازگاری با نسخه‌های قبلی پلتفرم جاوا را حفظ می‌کند - اکثر پروژه‌های جاوا که قبلاً نوشته شده‌اند، در صورت اجرا تحت نسخه جدید بدون تغییر کار می‌کنند. بیلدهای آماده برای نصب جاوا SE 22 (JDK، JRE و سرور JRE) برای لینوکس (x86_64، AArch64)، ویندوز (x86_64) و macOS (x86_64، AArch64) آماده شده اند. پیاده سازی مرجع جاوا 22 که توسط پروژه OpenJDK توسعه یافته است، کاملاً منبع باز تحت مجوز GPLv2 است، با استثناهای GNU ClassPath که امکان پیوند پویا با محصولات تجاری را فراهم می کند.

Java SE 22 به عنوان نسخه پشتیبانی معمولی طبقه بندی می شود و تا نسخه بعدی به دریافت به روز رسانی ها ادامه خواهد داد. شاخه پشتیبانی طولانی مدت (LTS) باید Java SE 21 یا Java SE 17 باشد که به ترتیب تا سال 2031 و 2029 به روز رسانی ها را دریافت خواهند کرد (به طور کلی تا سال 2028 و 2026 در دسترس هستند). پشتیبانی عمومی برای شاخه LTS Java SE 11 سپتامبر گذشته به پایان رسید، اما پشتیبانی گسترده تا سال 2032 ادامه خواهد داشت. پشتیبانی گسترده از شاخه LTS جاوا SE 8 تا سال 2030 ادامه خواهد داشت.

یادآوری می کنیم که با شروع انتشار جاوا 10، این پروژه به یک فرآیند توسعه جدید تبدیل شد که به معنای چرخه کوتاه تری برای شکل گیری نسخه های جدید است. عملکرد جدید اکنون در یک شاخه اصلی که دائماً به‌روز می‌شود، توسعه می‌یابد که شامل تغییرات آماده است و شاخه‌ها هر شش ماه یک‌بار برای تثبیت نسخه‌های جدید منشعب می‌شوند.

ویژگی های جدید جاوا 22 عبارتند از:

  • جمع‌آوری زباله G1 شامل پشتیبانی از پین کردن منطقه می‌شود، که به شما امکان می‌دهد به طور موقت مکان اشیاء جاوا را در حافظه ثابت کنید تا از جابجایی آنها توسط زباله‌گیر جلوگیری کنید و اجازه دهید ارجاعات به این اشیاء به طور ایمن بین جاوا و کد اصلی منتقل شوند. سنجاق کردن به شما امکان می دهد تا تاخیر را کاهش دهید و از غیرفعال کردن جمع آوری زباله در هنگام اجرای مناطق بحرانی JNI (رابط بومی جاوا) با کد بومی جلوگیری کنید (هنگام اجرای این بخش ها، JVM نباید اشیاء مهم مرتبط با آنها را به منظور جلوگیری از شرایط مسابقه جابجا کند). سنجاق کردن، اشیاء مهم را از دید زباله‌گیر حذف می‌کند، که می‌تواند به تمیز کردن مناطق بدون سنجاق ادامه دهد.
  • یک ویژگی مقدماتی اضافه شده است تا اجازه دهد عبارات در سازنده ها قبل از فراخوانی super(...) مشخص شوند، که برای فراخوانی صریح سازنده کلاس والد از سازنده کلاس ارثی استفاده می شود، اگر آن عبارات به نمونه ایجاد شده توسط سازنده اشاره نکنند. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } }
  • API FFM (Foreign Function & Memory) تثبیت شده است و به شما امکان می دهد تا تعامل برنامه های جاوا را با کد و داده های خارجی با فراخوانی توابع از کتابخانه های خارجی و دسترسی به حافظه خارج از JVM، بدون استفاده از JNI (رابط بومی جاوا) سازماندهی کنید. .
  • پشتیبانی از متغیرهای بی نام و تطبیق الگو فعال شده است - به جای متغیرها و الگوهای استفاده نشده اما ضروری هنگام فراخوانی، اکنون می توانید کاراکتر "_" را مشخص کنید. // was String pageName = switch (page) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> "ISSUE #" + issueNumber; ... }; // اکنون می توانید رشته pageName = switch (page) { case GitHubIssuePage(_, _, _, int issueNumber) -> "ISSUE #" + issueNumber; };
  • یک پیاده سازی اولیه از Class-File API برای تجزیه، تولید و تبدیل فایل های کلاس جاوا پیشنهاد شده است. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm &&mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce); } } });
  • ابزار جاوا امکان اجرای برنامه های جاوا را فراهم می کند که در قالب چندین فایل کد یا کتابخانه های کلاس از پیش کامپایل شده، بدون کامپایل جداگانه این فایل ها و بدون پیکربندی سیستم ساخت، ارائه می شود. این ویژگی جدید اجرای برنامه هایی را که در آنها کد کلاس های مختلف به فایل های جداگانه جدا شده است، آسان تر می کند. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Hello!"); } }

    به عنوان مثال، برای اجرای برنامه ای متشکل از دو فایل "Prog.java" و "Helper.java" اکنون کافی است "java Prog.java" را اجرا کنید، که کلاس Prog را کامپایل می کند، یک مرجع به کلاس Helper تعریف می کند. فایل Helper.java را پیدا کرده و کامپایل کنید و متد اصلی را فراخوانی کنید.

  • اجرای مقدماتی دوم از قالب‌های رشته‌ای را اضافه کرد که علاوه بر حروف الفبای رشته‌ها و بلوک‌های متنی پیاده‌سازی شد. قالب های رشته ای به شما امکان می دهند بدون استفاده از عملگر + متن را با عبارات و متغیرهای محاسبه شده ترکیب کنید. جایگزینی عبارات با استفاده از جایگزین‌های \{..} انجام می‌شود و کنترل‌کننده‌های خاصی را می‌توان برای بررسی صحت مقادیر جایگزین شده متصل کرد. به عنوان مثال، موتور SQL مقادیر جایگزین شده در کد SQL را بررسی می کند و یک شی java.sql.Statement را به عنوان خروجی برمی گرداند، در حالی که پردازنده JSON صحت تعویض های JSON را نظارت می کند و یک JsonNode برمی گرداند. پرس و جو رشته = "انتخاب * از شخص p WHERE p." + ویژگی + " = '" + مقدار + "'"; // was Statement query = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // شد
  • هفتمین پیش‌نمایش Vector API اضافه شده است که توابعی را برای محاسبات برداری ارائه می‌کند که با استفاده از دستورالعمل‌های برداری در پردازنده‌های x86_64 و AArch64 انجام می‌شوند و اجازه می‌دهند عملیات‌ها به طور همزمان روی چندین مقدار (SIMD) اعمال شوند. برخلاف قابلیت های ارائه شده در کامپایلر HotSpot JIT برای بردارسازی خودکار عملیات اسکالر، API جدید امکان کنترل صریح بردارسازی برای پردازش موازی داده را فراهم می کند.
  • یک پیاده سازی اولیه از API جریان توسعه یافته اضافه شده است که از تعریف عملیات میانی خود پشتیبانی می کند، که ممکن است در مواردی که عملیات میانی داخلی موجود برای تبدیل داده مورد نظر کافی نباشد، مفید باشد. هندلرهای بومی با استفاده از عملیات میانی جدید Stream::gather(Gatherer) متصل می شوند، که عناصر جریان را با اعمال یک کنترل کننده مشخص شده توسط کاربر برای آنها پردازش می کند. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4، 5، 6]، [7، 8، 9]]
  • نسخه دوم API آزمایشی برای Concurrency ساختاریافته برای آزمایش پیشنهاد شده است، که توسعه برنامه های کاربردی چند رشته ای را با پردازش چندین کار اجرا شده در رشته های مختلف به عنوان یک بلوک ساده ساده می کند.
  • اجرای مقدماتی دوم از کلاس‌های اعلام‌شده ضمنی و نمونه‌های بی‌نام متد «main» اضافه شد، که می‌تواند از اعلان‌های عمومی/ایستا، ارسال آرایه‌ای از آرگومان‌ها و سایر موجودیت‌های مرتبط با اعلان کلاس صرفنظر کند. // کلاس عمومی بود HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // اکنون می توانید main() { System.out.println("Hello, World!"); }
  • اجرای پیش‌نمایش دوم از Scoped Values ​​را اضافه کرد که به داده‌های تغییرناپذیر اجازه می‌دهد بین رشته‌ها به اشتراک گذاشته شود و داده‌ها به طور موثر بین رشته‌های فرزند رد و بدل شوند (مقادیر به ارث می‌رسند). Scoped Values ​​برای جایگزینی مکانیسم متغیرهای thread-local در حال توسعه هستند و هنگام استفاده از تعداد بسیار زیادی از رشته های مجازی (هزاران یا میلیون ها رشته) کارآمدتر هستند. تفاوت اصلی بین مقادیر Scoped و متغیرهای thread-local این است که اولی یک بار نوشته می شود، در آینده قابل تغییر نیست و فقط برای مدت اجرای thread در دسترس باقی می ماند.
  • جمع‌آوری زباله موازی هنگام کار با آرایه‌های بزرگ از اشیاء عملکرد را بهبود بخشیده است. بهینه سازی در برخی از آزمایشات با آرایه های بزرگ از اشیاء امکان کاهش تاخیر قبل از شروع جستجوی یک شی را تا 20٪ فراهم کرد.

علاوه بر این، می توانید به انتشار یک به روز رسانی برای پلت فرم برای ایجاد برنامه های کاربردی با رابط گرافیکی JavaFX 22 توجه کنید.

منبع: opennet.ru

اضافه کردن نظر