Java SE 16 sürümü

Altı aylık geliştirme sürecinin ardından Oracle, OpenJDK projesini referans uygulaması olarak kullanan Java SE 16'yı (Java Platformu, Standard Edition 16) piyasaya sürdü. Java SE 16, Java platformunun önceki sürümleriyle geriye dönük uyumluluğu korur; önceden yazılmış tüm Java projeleri, yeni sürüm altında başlatıldığında değişiklik olmadan çalışacaktır. Java SE 16'nın (JDK, JRE ve Server JRE) kuruluma hazır yapıları Linux (x86_64, AArch64), Windows ve macOS için hazırlanmıştır. OpenJDK projesi tarafından geliştirilen Java 16 referans uygulaması, ticari ürünlerle dinamik bağlantıya izin veren GNU ClassPath istisnalarıyla GPLv2 lisansı altında tamamen açık kaynaktır.

Java SE 16, genel destek sürümü olarak sınıflandırılmıştır ve bir sonraki sürüme kadar güncellemeleri almaya devam edecektir. Uzun Süreli Destek (LTS) dalı, 11 yılına kadar güncelleme almaya devam edecek olan Java SE 2026 olmalıdır. Bir sonraki LTS sürümünün Eylül 2021'de yayınlanması planlanıyor. Java 10'un çıkışıyla birlikte projenin yeni bir geliştirme sürecine geçtiğini, bunun da yeni sürümlerin oluşumu için daha kısa bir döngü anlamına geldiğini hatırlatalım. Yeni işlevsellik artık sürekli olarak güncellenen, hazır değişiklikleri içeren ve yeni sürümleri dengelemek için her altı ayda bir dallara ayrılan ana dalda geliştirilmektedir.

Yeni sürüme hazırlık olarak geliştirme, Mercurial sürüm kontrol sisteminden Git ve GitHub işbirlikçi geliştirme platformuna taşındı. Geçişin, depo operasyonlarının performansını iyileştirmesi, depolama verimliliğini artırması, proje geçmişi boyunca yapılan değişikliklere erişim sağlaması, kod inceleme desteğini geliştirmesi ve API'lerin iş akışlarını otomatikleştirmesine olanak sağlaması bekleniyor. Ayrıca Git ve GitHub kullanımı, projeyi yeni başlayanlar ve Git'e alışkın geliştiriciler için daha çekici hale getiriyor.

Java 16'deki yeni özellikler şunları içerir:

  • x86_64 ve AArch64 işlemcilerdeki vektör talimatları kullanılarak gerçekleştirilen vektör hesaplamaları için işlevler sağlayan ve işlemlerin aynı anda birden fazla değere (SIMD) uygulanmasına olanak tanıyan Vector API uygulamasına sahip deneysel modül jdk.incubator.vector eklendi. Skaler işlemlerin otomatik vektörleştirilmesi için HotSpot JIT derleyicisinde sağlanan yeteneklerin aksine, yeni API, paralel veri işleme için vektörleştirmeyi açıkça kontrol etmenize olanak tanır.
  • C++ ile yazılan JDK ve VM HotSpot kodunun, C++14 spesifikasyonunda sunulan özellikleri kullanmasına izin verilir. Daha önce C++98/03 standartlarına izin veriliyordu.
  • Pasif modda çalışan ve çöp toplamadan kaynaklanan gecikmeleri mümkün olduğunca en aza indiren ZGC (Z Garbage Collector), uygulama thread'lerini duraklatmadan thread stack'lerini paralel olarak işleme yeteneğini eklemiştir. ZGC artık yalnızca, genellikle birkaç yüz mikrosaniyeyi aşmayan, sabit gecikmelere sahip, askıya alma gerektiren bir işe sahip.
  • SocketChannel, ServerSocketChannel ve java.nio.channels sınıflarına Unix soketleri (AF_UNIX) desteği eklendi.
  • Konteynerler, mikro hizmetler, bulut ve gömülü sistemlere yönelik ortamlarda popüler olan standart C kitaplığı musl ile Linux dağıtımı Alpine için bir bağlantı noktası uygulandı. Bu tür ortamlarda önerilen bağlantı noktası, Java programlarını normal uygulamalar gibi çalıştırmanıza olanak tanır. Ayrıca jlink kullanarak kullanılmayan tüm modülleri kaldırabilir ve uygulamayı çalıştırmaya yetecek minimal bir ortam oluşturabilir, bu da uygulamaya özel kompakt görüntüler oluşturmanıza olanak tanır.
  • JVM HotSpot'ta sınıf meta verilerinin (metaspace) kapladığı belleği ayırma ve geri döndürme işlemlerini optimize eden Elastic Metaspace mekanizması uygulandı. Elastic Metaspace kullanımı bellek parçalanmasını azaltır, sınıf yükleyici yükünü azaltır ve ayrıca kullanılmayan sınıf meta verilerinin kapladığı belleğin işletim sistemine daha hızlı geri dönmesi nedeniyle uzun süre çalışan sunucu uygulamalarının performansı üzerinde olumlu bir etkiye sahiptir. Sınıfları boşalttıktan sonra bellek serbest bırakma modunu seçmek için “-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)” seçeneği sunulur.
  • AArch64 mimarisini temel alan işlemcilere sahip donanım üzerinde çalışan Windows sistemleri için bir JDK bağlantı noktası eklenmiştir.
  • Yabancı Bellek Erişimi API'sinin üçüncü bir önizlemesi önerildi; bu önizleme, Java uygulamalarının, yeni MemorySegment, MemoryAddress ve MemoryLayout soyutlamalarını işleyerek Java yığını dışındaki bellek bölgelerine güvenli ve verimli bir şekilde erişmesine olanak tanıyor.
  • Java'dan yerel koda erişim sağlayan deneysel bir Yabancı Bağlayıcı API'si uygulandı. Yabancı Bellek API'si ile birlikte yeni programlama arayüzü, geleneksel paylaşılan kitaplıklar üzerinde sarmalayıcılar oluşturmayı çok daha kolay hale getiriyor.
  • Bağımsız Java uygulamaları için paketler oluşturmanıza olanak tanıyan jpackage yardımcı programı eklendi. Yardımcı program, JavaFX'in javapackager'ını temel alır ve çeşitli platformlara özgü formatlarda paketler oluşturmanıza olanak tanır (Windows için msi ve exe, macOS için pkg ve dmg, Linux için deb ve rpm). Paketler gerekli tüm bağımlılıkları içerir.
  • Sun.misc.Unsafe gibi kritik API'ler haricinde, tüm JDK dahili bileşenlerinin sıkı kapsüllenmesi varsayılan olarak etkindir. "--illegal-access" seçeneğinin değeri artık varsayılan olarak "izin ver" yerine "reddet" olarak ayarlanmıştır; bu, kodun çoğu dahili sınıfa, yönteme ve alana erişme girişimlerini engelleyecektir. Kısıtlamayı atlamak için “-illegal-access=permit” seçeneğini kullanın.
  • "instanceof" operatöründe desen eşleştirmenin uygulanması stabilize edildi; bu, kontrol edilen değere atıfta bulunacak yerel bir değişkeni anında tanımlamanıza olanak tanır. Örneğin, “String s = (String) obj” ifadesini açıkça tanımlamadan hemen “if (obj exampleof String s && s.length() > 5) {.. s.contains(..) ..}” yazabilirsiniz. Şuydu: if (obj örneğinin Grubu) { Grup grubu = (Grup) obj; var girişleri = group.getEntries(); } Artık “Grup grubu = (Grup) obj” tanımlamadan da yapabilirsiniz: if (obj Instanceof Grup grubu) { var entrys = group.getEntries(); }
  • Verilerin depolandığı durumlarda equals(), hashCode() ve toString() gibi çeşitli düşük seviyeli yöntemlerin açıkça tanımlanması ihtiyacını ortadan kaldıran sınıf tanımları için kompakt bir form sağlayarak "record" anahtar sözcüğünün uygulanması stabil hale getirildi yalnızca değişmediği alanlarda. Bir sınıf equals(), hashCode() ve toString() yöntemlerinin standart uygulamalarını kullandığında, bunların açık tanımları olmadan da bunu yapabilir: genel kayıt BankTransaction(LocalDate date, double miktar, String açıklaması) {}

    Bu bildirim, yapıcı ve alıcı yöntemlerine ek olarak equals(), hashCode() ve toString() yöntemlerinin uygulamalarını otomatik olarak ekleyecektir.

  • Uygulamaları devralmak, genişletmek veya geçersiz kılmak için diğer sınıflar ve arayüzler tarafından kullanılamayan mühürlü sınıflar ve arayüzler için ikinci bir taslak önerildi. Mühürlü sınıflar ayrıca, genişletme için izin verilen alt sınıfların açıkça listelenmesine dayalı olarak, bir üst sınıfın kullanımını erişim değiştiricilere göre kısıtlamak için daha bildirimsel bir yol sağlar. paket com.example.geometry; genel mühürlü sınıf Şekil izinleri com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Kaynak: opennet.ru

Yorum ekle