پس از شش ماه توسعه، Oracle جاوا SE 16 (پلتفرم جاوا، نسخه استاندارد 16) را منتشر کرد که از پروژه OpenJDK به عنوان پیاده سازی مرجع استفاده می کند. Java SE 16 سازگاری با نسخه های قبلی پلتفرم جاوا را حفظ می کند؛ تمام پروژه های جاوا که قبلاً نوشته شده بودند، در صورت راه اندازی تحت نسخه جدید بدون تغییر کار خواهند کرد. بیلدهای آماده نصب جاوا SE 16 (JDK، JRE و سرور JRE) برای لینوکس (x86_64، AArch64)، ویندوز و macOS آماده شده اند. پیاده سازی مرجع جاوا 16 که توسط پروژه OpenJDK توسعه یافته است، کاملاً منبع باز تحت مجوز GPLv2 است، با استثناهای GNU ClassPath که امکان پیوند پویا با محصولات تجاری را فراهم می کند.
جاوا SE 16 به عنوان نسخه پشتیبانی عمومی طبقه بندی می شود و تا نسخه بعدی به دریافت به روز رسانی ادامه خواهد داد. شاخه پشتیبانی طولانی مدت (LTS) باید جاوا SE 11 باشد که تا سال 2026 به دریافت به روز رسانی ادامه خواهد داد. نسخه بعدی LTS برای سپتامبر 2021 برنامه ریزی شده است. یادآوری می کنیم که با شروع انتشار جاوا 10، این پروژه به یک فرآیند توسعه جدید تبدیل شد که به معنای چرخه کوتاه تری برای شکل گیری نسخه های جدید است. عملکرد جدید اکنون در یک شاخه اصلی که دائماً بهروز میشود، توسعه مییابد که شامل تغییرات آماده است و شاخهها هر شش ماه یکبار برای تثبیت نسخههای جدید منشعب میشوند.
در آماده سازی برای نسخه جدید، توسعه از سیستم کنترل نسخه Mercurial به Git و پلتفرم توسعه مشارکتی GitHub منتقل شده است. انتظار می رود که این انتقال عملکرد عملیات مخزن را بهبود بخشد، کارایی ذخیره سازی را افزایش دهد، دسترسی به تغییرات در طول تاریخ پروژه را فراهم کند، پشتیبانی از بازبینی کد را بهبود بخشد و API ها را برای خودکارسازی گردش کار فعال کند. علاوه بر این، استفاده از Git و GitHub این پروژه را برای مبتدیان و توسعه دهندگانی که به Git عادت کرده اند جذاب تر می کند.
ویژگی های جدید جاوا 16 عبارتند از:
- اضافه شدن ماژول آزمایشی jdk.incubator.vector با پیاده سازی Vector API، که توابعی را برای محاسبات برداری ارائه می کند که با استفاده از دستورالعمل های برداری در پردازنده های x86_64 و AArch64 انجام می شود و اجازه می دهد تا عملیات به طور همزمان روی چندین مقدار (SIMD) اعمال شود. برخلاف قابلیتهای ارائهشده در کامپایلر HotSpot JIT برای بردارسازی خودکار عملیات اسکالر، API جدید به شما اجازه میدهد تا بهصراحت بردارسازی را برای پردازش دادههای موازی کنترل کنید.
- کد JDK و VM HotSpot نوشته شده در C++ مجاز به استفاده از ویژگی های معرفی شده در مشخصات C++14 است. قبلا استانداردهای C++98/03 مجاز بودند.
- ZGC (Z Garbage Collector) که در حالت غیرفعال عمل می کند و تاخیرهای ناشی از جمع آوری زباله را تا حد امکان به حداقل می رساند، توانایی پردازش پشته های نخ را به صورت موازی بدون توقف رشته های برنامه اضافه کرده است. ZGC اکنون فقط کارهایی دارد که نیاز به تعلیق دارند، که تاخیرهای ثابتی دارد که معمولاً از چند صد میکروثانیه تجاوز نمی کند.
- پشتیبانی از سوکت های یونیکس (AF_UNIX) به کلاس های SocketChannel، ServerSocketChannel و java.nio.channels اضافه شده است.
- یک پورت برای توزیع لینوکس Alpine با کتابخانه استاندارد C musl پیادهسازی شده است که در محیطهای کانتینرها، میکروسرویسها، ابر و سیستمهای جاسازی شده محبوب است. پورت پیشنهادی در چنین محیط هایی به شما امکان می دهد برنامه های جاوا را مانند برنامه های معمولی اجرا کنید. علاوه بر این، با استفاده از jlink، میتوانید تمام ماژولهای بلااستفاده را حذف کنید و یک محیط حداقلی برای اجرای برنامه ایجاد کنید که به شما امکان میدهد تصاویر فشرده مخصوص برنامه ایجاد کنید.
- مکانیزم Elastic Metaspace پیاده سازی شده است، بهینه سازی عملیات تخصیص و برگرداندن حافظه اشغال شده توسط فراداده کلاس (metaspace) در JVM HotSpot. استفاده از Elastic Metaspace باعث کاهش تکه تکه شدن حافظه، کاهش سربار کلاس بارگذار می شود و همچنین به دلیل بازگشت سریعتر حافظه اشغال شده توسط فراداده کلاس استفاده نشده به سیستم عامل، تأثیر مفیدی بر عملکرد برنامه های طولانی مدت سرور دارد. برای انتخاب حالت انتشار حافظه پس از بارگیری کلاس ها، گزینه "-XX:MetaspaceReclaimPolicy=(متعادل|تهاجمی|هیچکدام)" ارائه می شود.
- یک پورت JDK برای سیستمهای ویندوزی که روی سختافزار با پردازندههای مبتنی بر معماری AArch64 اجرا میشوند، اضافه شده است.
- پیشنمایش سومی از API دسترسی به حافظه خارجی پیشنهاد شده است که به برنامههای جاوا اجازه میدهد تا با دستکاری انتزاعهای MemorySegment، MemoryAddress و MemoryLayout به طور ایمن و کارآمد به مناطق حافظه خارج از پشته جاوا دسترسی داشته باشند.
- یک API خارجی Linker آزمایشی پیادهسازی شده است که دسترسی از جاوا به کد بومی را فراهم میکند. همراه با Foreign-Memory API، رابط برنامه نویسی جدید ایجاد لفاف بر روی کتابخانه های مشترک معمولی را بسیار آسان تر می کند.
- ابزار jpackage اضافه شده است که به شما امکان می دهد بسته هایی را برای برنامه های کاربردی جاوا مستقل ایجاد کنید. این ابزار مبتنی بر javapackager از JavaFX است و به شما امکان می دهد بسته هایی را با فرمت های بومی برای پلتفرم های مختلف (msi و exe برای ویندوز، pkg و dmg برای macOS، deb و rpm برای لینوکس) ایجاد کنید. بسته ها شامل تمام وابستگی های مورد نیاز است.
- کپسولهسازی دقیق همه موارد داخلی JDK بهطور پیشفرض فعال است، به استثنای APIهای مهم مانند sun.misc.Unsafe. مقدار گزینه «--inlegal-access» اکنون بهطور پیشفرض به جای «مجوز» روی «انکار» تنظیم شده است، که تلاشها را از کد برای دسترسی به اکثر کلاسها، روشها و فیلدهای داخلی مسدود میکند. برای دور زدن محدودیت، از گزینه -illegal-access=permit استفاده کنید.
- اجرای تطبیق الگو در عملگر "instanceof" تثبیت شده است، که به شما امکان می دهد بلافاصله یک متغیر محلی را برای ارجاع به مقدار بررسی شده تعریف کنید. برای مثال، میتوانید بلافاصله بنویسید: «if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}» بدون اینکه صریحاً «String s = (String) obj» را تعریف کنید. بود: if (obj instanceof Group) { Group group = (Group) obj; var entries = group.getEntries(); } اکنون می توانید بدون تعریف «گروه گروه = (گروه) obj»: if (obj instanceof Group group) { var entries = group.getEntries(); }
- پیاده سازی کلمه کلیدی "record" تثبیت شده است، و یک فرم فشرده برای تعاریف کلاس ارائه می دهد که نیاز به تعریف صریح متدهای سطح پایین مختلف مانند ()quals()، hashCode() و toString() را در مواردی که داده ها ذخیره می شوند را از بین می برد. فقط در زمینه هایی که با آنها تغییر نمی کند. هنگامی که یک کلاس از پیاده سازی های استاندارد متدهای ()quals()، hashCode() و toString() استفاده می کند، می تواند بدون تعریف صریح آنها این کار را انجام دهد: رکورد عمومی BankTransaction(تاریخ LocalDate، مقدار دو برابر، شرح رشته) {}
این اعلان به طور خودکار پیاده سازی های متدهای ()quals()، hashCode() و toString() را علاوه بر متدهای سازنده و دریافت کننده اضافه می کند.
- پیش نویس دوم برای کلاس ها و رابط های مهر و موم شده پیشنهاد شده است که نمی توانند توسط کلاس ها و رابط های دیگر برای ارث بردن، گسترش یا نادیده گرفتن پیاده سازی ها استفاده شوند. کلاسهای مهر و موم شده همچنین بر اساس فهرستبندی صریح زیر کلاسهای مجاز برای گسترش، روشی شفافتر برای محدود کردن استفاده از سوپرکلاس نسبت به اصلاحکنندههای دسترسی ارائه میکنند. بسته com.example.geometry; کلاس مهر و موم شده عمومی مجوزهای شکل com.example.polar.Circle، com.example.quad.Rectangle، com.example.quad.simple.Square {…}
منبع: opennet.ru