Bản phát hành Java SE 16

Sau sáu tháng phát triển, Oracle đã phát hành Java SE 16 (Nền tảng Java, Phiên bản tiêu chuẩn 16), sử dụng dự án OpenJDK làm triển khai tham chiếu. Java SE 16 duy trì khả năng tương thích ngược với các bản phát hành trước của nền tảng Java; tất cả các dự án Java được viết trước đó sẽ hoạt động mà không có thay đổi khi khởi chạy trong phiên bản mới. Các bản dựng sẵn sàng cài đặt của Java SE 16 (JDK, JRE và Server JRE) được chuẩn bị cho Linux (x86_64, AArch64), Windows và macOS. Được phát triển bởi dự án OpenJDK, việc triển khai tham chiếu Java 16 hoàn toàn là nguồn mở theo giấy phép GPLv2, với các ngoại lệ GNU ClassPath cho phép liên kết động với các sản phẩm thương mại.

Java SE 16 được phân loại là bản phát hành hỗ trợ chung và sẽ tiếp tục nhận được các bản cập nhật cho đến bản phát hành tiếp theo. Nhánh Hỗ trợ dài hạn (LTS) phải là Java SE 11, nhánh này sẽ tiếp tục nhận được các bản cập nhật cho đến năm 2026. Bản phát hành LTS tiếp theo dự kiến ​​​​vào tháng 2021 năm 10. Hãy để chúng tôi nhắc bạn rằng bắt đầu từ việc phát hành Java XNUMX, dự án đã chuyển sang một quy trình phát triển mới, ngụ ý rằng chu kỳ hình thành các bản phát hành mới sẽ ngắn hơn. Chức năng mới hiện được phát triển trong một nhánh chính được cập nhật liên tục, bao gồm các thay đổi được thực hiện sẵn và từ đó các nhánh được phân nhánh sáu tháng một lần để ổn định các bản phát hành mới.

Để chuẩn bị cho bản phát hành mới, quá trình phát triển đã chuyển từ hệ thống kiểm soát phiên bản Mercurial sang nền tảng phát triển hợp tác Git và GitHub. Việc di chuyển dự kiến ​​sẽ cải thiện hiệu suất hoạt động của kho lưu trữ, tăng hiệu quả lưu trữ, cung cấp quyền truy cập vào các thay đổi trong suốt lịch sử của dự án, cải thiện khả năng hỗ trợ đánh giá mã và cho phép API tự động hóa quy trình công việc. Ngoài ra, việc sử dụng Git và GitHub khiến dự án trở nên hấp dẫn hơn đối với người mới bắt đầu và nhà phát triển đã quen với Git.

Các tính năng mới trong Java 16 bao gồm:

  • Đã thêm mô-đun thử nghiệm jdk.incubator.vector với việc triển khai API Vector, cung cấp các chức năng tính toán vectơ được thực hiện bằng cách sử dụng hướng dẫn vectơ trên bộ xử lý x86_64 và AArch64, đồng thời cho phép áp dụng đồng thời các thao tác cho nhiều giá trị (SIMD). Ngược lại với các khả năng được cung cấp trong trình biên dịch HotSpot JIT để tự động vector hóa các phép toán vô hướng, API mới cho phép bạn kiểm soát rõ ràng việc vector hóa để xử lý dữ liệu song song.
  • Mã JDK và VM HotSpot viết bằng C++ được phép sử dụng các tính năng được giới thiệu trong đặc tả C++14. Trước đây, tiêu chuẩn C++98/03 đã được cho phép.
  • ZGC (Z Garbage Collector), hoạt động ở chế độ thụ động và giảm thiểu độ trễ do thu gom rác nhiều nhất có thể, đã bổ sung khả năng xử lý song song các ngăn xếp luồng mà không cần tạm dừng các luồng ứng dụng. ZGC hiện chỉ có công việc yêu cầu tạm dừng, có độ trễ liên tục, thường không vượt quá vài trăm micro giây.
  • Đã thêm hỗ trợ cho các ổ cắm Unix (AF_UNIX) vào các lớp SocketChannel, ServerSocketChannel và java.nio.channels.
  • Một cổng đã được triển khai cho bản phân phối Linux Alpine với thư viện musl C tiêu chuẩn, phổ biến trong các môi trường dành cho bộ chứa, vi dịch vụ, đám mây và hệ thống nhúng. Cổng được đề xuất trong các môi trường như vậy cho phép bạn chạy các chương trình Java giống như các ứng dụng thông thường. Ngoài ra, bằng cách sử dụng jlink, bạn có thể loại bỏ tất cả các mô-đun không sử dụng và tạo một môi trường tối thiểu đủ để chạy ứng dụng, cho phép bạn tạo các hình ảnh nhỏ gọn dành riêng cho ứng dụng.
  • Cơ chế Elastic Metaspace đã được triển khai, tối ưu hóa các hoạt động phân bổ và trả lại bộ nhớ do siêu dữ liệu lớp (metaspace) chiếm giữ trong JVM HotSpot. Việc sử dụng Elastic Metaspace giúp giảm phân mảnh bộ nhớ, giảm chi phí của trình nạp lớp và cũng có tác dụng có lợi đối với hiệu suất của các ứng dụng máy chủ chạy trong thời gian dài do trả lại bộ nhớ do siêu dữ liệu lớp không sử dụng trở lại hệ điều hành nhanh hơn. Để chọn chế độ giải phóng bộ nhớ sau khi dỡ bỏ các lớp, tùy chọn “-XX:MetaspaceReclaimPolicy=(balance|aggressive|none)” được cung cấp.
  • Một cổng JDK đã được thêm vào cho các hệ thống Windows chạy trên phần cứng có bộ xử lý dựa trên kiến ​​trúc AArch64.
  • Bản xem trước thứ ba của API truy cập bộ nhớ ngoài đã được đề xuất, cho phép các ứng dụng Java truy cập một cách an toàn và hiệu quả các vùng bộ nhớ bên ngoài vùng nhớ Java bằng cách thao tác các bản tóm tắt MemorySegment, MemoryAddress và MemoryLayout mới.
  • API Trình liên kết nước ngoài thử nghiệm đã được triển khai, cung cấp quyền truy cập từ Java vào mã gốc. Cùng với API bộ nhớ ngoài, giao diện lập trình mới giúp việc tạo trình bao bọc trên các thư viện dùng chung thông thường trở nên dễ dàng hơn nhiều.
  • Đã thêm tiện ích jpackage, cho phép bạn tạo các gói cho các ứng dụng Java độc lập. Tiện ích này dựa trên javapackager từ JavaFX và cho phép bạn tạo các gói ở định dạng riêng cho nhiều nền tảng khác nhau (msi và exe cho Windows, pkg và dmg cho macOS, deb và vòng/phút cho Linux). Các gói bao gồm tất cả các phụ thuộc cần thiết.
  • Theo mặc định, tính năng đóng gói nghiêm ngặt của tất cả các phần bên trong JDK được bật, ngoại trừ các API quan trọng như sun.misc.Unsafe. Giá trị của tùy chọn “--illegal-access” hiện được đặt thành “deny” thay vì “permit” theo mặc định, điều này sẽ chặn các nỗ lực từ mã để truy cập hầu hết các lớp, phương thức và trường nội bộ. Để bỏ qua hạn chế, hãy sử dụng tùy chọn “-illegal-access=permit”.
  • Việc triển khai khớp mẫu trong toán tử “instanceof” đã được ổn định, cho phép bạn xác định ngay một biến cục bộ để tham chiếu đến giá trị đã kiểm tra. Ví dụ: bạn có thể viết ngay “if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}” mà không cần xác định rõ ràng “String s = (String) obj”. Đã là: if (obj instanceof Group) { Nhóm nhóm = (Group) obj; var entry = group.getEntries(); } Bây giờ bạn có thể thực hiện mà không cần xác định “Group group = (Group) obj”: if (obj instanceof Group group) { varentry = group.getEntries(); }
  • Việc triển khai từ khóa "record" đã được ổn định, cung cấp một biểu mẫu nhỏ gọn cho các định nghĩa lớp giúp loại bỏ nhu cầu xác định rõ ràng các phương thức cấp thấp khác nhau như Equals(), hashCode() và toString() trong trường hợp dữ liệu được lưu trữ chỉ trong các lĩnh vực mà nó không thay đổi. Khi một lớp sử dụng cách triển khai tiêu chuẩn của các phương thức bằng(), hashCode() và toString(), nó có thể thực hiện mà không cần định nghĩa rõ ràng: bản ghi công khai BankTransaction(LocalDate date, double money, String description) {}

    Tuyên bố này sẽ tự động thêm việc triển khai các phương thức bằng(), hashCode() và toString() bên cạnh các phương thức khởi tạo và getter.

  • Bản dự thảo thứ hai được đề xuất cho các lớp và giao diện kín mà các lớp và giao diện khác không thể sử dụng để kế thừa, mở rộng hoặc ghi đè các triển khai. Các lớp kín cũng cung cấp một cách khai báo rõ ràng hơn để hạn chế việc sử dụng siêu lớp hơn là các công cụ sửa đổi quyền truy cập, dựa trên việc liệt kê rõ ràng các lớp con được phép mở rộng. gói com.example.geometry; lớp kín công khai Giấy phép hình dạng com.example.pol.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Nguồn: opennet.ru

Thêm một lời nhận xét