Java 11
var (trong lambda)
Từ giờ trở đi, chúng ta có thể chỉ định các loại tham số lambda hoặc bỏ qua chúng khi viết biểu thức lambda (biểu thức lambda được gõ ngầm):Function<String, String> append = (var string) -> string + " Text";
String appendedString = append.apply("Some");
System.out.println(appendedString);
Bạn cũng có thể thêm chú thích vào tham số lambda mà không cần phải viết tên loại biến đầy đủ:
Function<String, String> append = (@NonNull var string) -> string + " Text";
Z(ZGC)
ZGC là một trình thu gom rác mới không hoạt động. Nó phân bổ bộ nhớ mới nhưng không bao giờ khởi động lại nó. ZGC hứa hẹn sẽ quản lý lượng bộ nhớ lớn với thông lượng cao và độ trễ thấp (ZGC chỉ khả dụng trên nền tảng 64-bit). Tô màu tham chiếu - ZGC sử dụng con trỏ 64 bit với kỹ thuật gọi là tô màu con trỏ. Con trỏ màu lưu trữ thông tin bổ sung về các đối tượng trên heap. Khi bộ nhớ bị phân mảnh, điều này giúp tránh suy giảm hiệu suất khi GC cần tìm chỗ cho phân bổ mới. Việc thu gom rác bằng ZGC bao gồm các bước sau:- thế giới dừng lại: chúng tôi tìm kiếm điểm bắt đầu để tiếp cận các đối tượng trên vùng nhớ heap (chẳng hạn như biến cục bộ hoặc trường tĩnh);
- giao điểm của đồ thị đối tượng bắt đầu từ các liên kết gốc. Chúng tôi đánh dấu từng đối tượng mà chúng tôi tiếp cận (ZGC đi qua biểu đồ đối tượng và kiểm tra các điểm đánh dấu màu, đánh dấu các đối tượng có sẵn);
- xử lý một số trường hợp khó khăn, chẳng hạn như liên kết yếu;
- di chuyển các đối tượng sống, giải phóng các vùng lớn của heap để tăng tốc độ phân bổ.
- khi giai đoạn di chuyển bắt đầu, ZGC chia vùng heap thành các trang và xử lý từng trang một;
- ZGC kết thúc chuyển động của bất kỳ rễ nào và phần còn lại của chuyển động sẽ diễn ra.
- Giới thiệu về ZGC: Trình thu gom rác JVM có độ trễ thấp có thể mở rộng và thử nghiệm
- Trình thu gom rác tự chế cho Open JDK
- Trình thu gom rác Z mới của Java (ZGC) rất thú vị
Epsilon GC
Epsilon là trình thu gom rác xử lý việc cấp phát bộ nhớ nhưng không triển khai bất kỳ cơ chế khôi phục bộ nhớ thực nào. Khi vùng heap Java có sẵn đã cạn kiệt, JVM sẽ tắt. Nghĩa là, nếu bạn bắt đầu tạo một đối tượng trong một mảng vô hạn mà không liên kết với một tham chiếu bằng trình thu gom rác này, thì ứng dụng sẽ gặp sự cố với OutOfMemoryError (và nếu có bất kỳ đối tượng nào khác thì sẽ không, vì nó sẽ dọn sạch các đối tượng không có tham chiếu) . Tại sao nó lại cần thiết? Đây là lý do tại sao:- Kiểm tra năng suất.
- Kiểm tra áp lực bộ nhớ.
- Kiểm tra giao diện VM.
- Công việc cực kỳ ngắn.
- Cải thiện độ trễ ở lần thả cuối cùng.
- Cải thiện thông lượng ở lần thả cuối cùng.
- GC Epsilon mới. Java có thể không có bộ sưu tập rác. Sốc. cảm giác
- Giới thiệu về Epsilon GC: Công cụ thu gom rác thử nghiệm không hoạt động
ByteArrayOutputStream
có một phương thứcvoid writeBytes(byte [])
ghi tất cả các byte từ đối số vàoOutputStream
.FileReader
vàFileWriter
có các hàm tạo mới cho phép bạn chỉ định Bộ ký tự.Path
lấy hai phương thức mới,of(String, String [])
trả vềPath
từ một đối số chuỗi một đường dẫn hoặc chuỗi các chuỗi mà khi kết hợp sẽ tạo thành một chuỗi đường dẫn vàof(URI)
: trả về Đường dẫn từ một URI.Pattern
— đã nhận được một phương thứcasMatchPredicate()
kiểm tra xem một chuỗi đầu vào nhất định có khớp với một mẫu nhất định hay không (liệu nó có cho phép bạn tạo một vị từ bằng cách sử dụng biểu thức chính quy để bạn có thể lọc dữ liệu trong luồng chẳng hạn hay không).String
Tôi đã chọn ra nhiều phương pháp hữu ích, chẳng hạn như:String strip()
: sẽ trả về cho chúng ta một chuỗi là chuỗi này, với tất cả khoảng trắng ở đầu và cuối chuỗi bị loại bỏ (tương tự như Trim(), nhưng xác định khoảng trắng theo cách khác);String stripLeading()
: sẽ trả về cho chúng ta chuỗi đó là chuỗi này, loại bỏ mọi khoảng trắng ở đầu chuỗi;String stripTrailing()
: sẽ trả về cho chúng ta chuỗi chính là chuỗi này, loại bỏ mọi khoảng trắng ở cuối chuỗi;Stream lines()
: sẽ trả về cho chúng taStream
từString
, được trích xuất từ chuỗi này, được phân tách bằng dấu phân cách dòng;String repeat(int)
: sẽ trả về cho chúng ta một chuỗi là chuỗi nối của chuỗi này, được lặp lại một số lần.boolean isBlank()
: sẽ trả về true nếu chuỗi trống hoặc chỉ chứa khoảng trắng, ngược lại là false.
Thread
— các phương thức destroy() và stop(Ném được) đã bị xóa.Files
có một số phương pháp mới:String readString(Path)
: đọc tất cả dữ liệu từ một tệp thành một chuỗi, đồng thời giải mã từ byte thành ký tự bằng mã hóa UTF-8;String readString(Path, Charset)
: giống như trong phương pháp trên, với điểm khác biệt là việc giải mã từ byte thành ký tự xảy ra bằng cách sử dụng Bộ ký tự được chỉ định;Path writeString (Path, CharSequence, OpenOption [])
: Ghi một chuỗi ký tự vào một tập tin. Các ký tự được mã hóa thành byte bằng mã hóa UTF-8;Path writeString(Path, CharSequence,Charset, OpenOption [])
: Phương pháp tương tự như trên, chỉ các ký tự được mã hóa thành byte bằng cách sử dụng mã hóa được chỉ định trong Charset.
Java 12
Sáu tháng trôi qua và chúng ta thấy giai đoạn tiếp theo trong quá trình phát triển của Java. Vì vậy, đã đến lúc lấy xẻng kiến thức ra và đào bới.Cập nhật G1
Những cải tiến sau đây đã được thực hiện cho G1:-
Đòi lại bộ nhớ được phân bổ không sử dụng
Trong bộ nhớ heap Java có một thứ gọi là bộ nhớ không được sử dụng (hay nói cách khác là không hoạt động). Trong Java 12, họ đã quyết định khắc phục sự cố này ngay bây giờ:
- G1 trả về bộ nhớ từ vùng heap trong một GC đầy đủ hoặc trong một vòng lặp song song; G1 cố gắng ngăn GC đầy đủ và bắt đầu một vòng lặp song song dựa trên phân bổ vùng heap. Chúng ta sẽ phải buộc G1 trả lại bộ nhớ từ heap.
Cải tiến này tập trung vào hiệu suất bằng cách tự động trả lại bộ nhớ từ heap về HĐH khi G1 không được sử dụng.
-
Hủy bỏ các bộ sưu tập hỗn hợp khi vượt quá thời gian tạm dừng
G1 sử dụng công cụ phân tích để chọn khối lượng công việc cần thiết cho việc thu gom rác. Nó thu thập các đối tượng sống mà không dừng lại sau khi xác định tập hợp và bắt đầu dọn dẹp. Điều này khiến trình thu gom rác vượt quá mục tiêu thời gian tạm dừng. Trên thực tế, vấn đề này được giải quyết bằng cách cải tiến, vì nếu thời gian cần thiết để hoàn thành bước tiếp theo vượt quá giới hạn hợp lý thì bước này có thể bị gián đoạn.
Điểm chuẩn vi mô
Java 12 đã giới thiệu các thử nghiệm đo điểm chuẩn vi mô để có thể dễ dàng kiểm tra hiệu suất của JVM bằng các điểm chuẩn hiện có. Điều này sẽ rất hữu ích cho những ai muốn làm việc trên chính JVM. Các thử nghiệm bổ sung được tạo bằng cách sử dụng Java Microbenchmark Harness (JMH). Các thử nghiệm này cho phép thử nghiệm hiệu năng liên tục trên JVM. JEP 230 đề xuất giới thiệu khoảng 100 bài kiểm tra, với các bài kiểm tra mới được giới thiệu khi các phiên bản Java mới được phát hành. Đây là một ví dụ về các bài kiểm tra đang được thêm vào .Shenandoah
Đây là thuật toán thu gom rác (GC) có mục tiêu là đảm bảo thời gian phản hồi thấp (giới hạn thấp hơn là 10-500 ms). Điều này giúp giảm thời gian tạm dừng GC khi thực hiện công việc dọn dẹp đồng thời với việc chạy các luồng Java. Ở Shenandoah, thời gian tạm dừng không phụ thuộc vào kích thước vùng heap. Điều này có nghĩa là thời gian tạm dừng sẽ giống nhau bất kể kích thước vùng heap của bạn. Đây là một tính năng thử nghiệm và không có trong bản dựng tiêu chuẩn (Oracle) của OpenJDK.Cải thiện chuyển đổi
Java 12 đã cải tiến biểu thức Switch để khớp mẫu. Cú pháp mới L → được giới thiệu. Dưới đây là danh sách các điểm chính của công tắc mới :- Cú pháp mới loại bỏ sự cần thiết của câu lệnh break để ngăn ngừa lỗi.
- Chuyển đổi biểu thức không còn thất bại nữa.
- Ngoài ra, chúng ta có thể định nghĩa nhiều hằng số trong một nhãn.
- trường hợp mặc định hiện được yêu cầu trong biểu thức chuyển đổi.
- break được sử dụng trong biểu thức Switch để trả về các giá trị từ chính thanh ghi (trên thực tế, một switch có thể trả về các giá trị).
var result = switch (someDay) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(someDay.isEmpty())
break "Please insert a valid day.";
else
break "Looks like a Sunday.";
}
};
Hướng dẫn dứt khoát để chuyển đổi biểu thức trong Java 13 Các tính năng mới khác:
-
String:
transform(Function f)
- Áp dụng hàm được cung cấp cho một chuỗi. Kết quả có thể không phải là một chuỗi.indent(int x)
— thêm x dấu cách vào chuỗi. Nếu tham số âm thì số khoảng trắng ở đầu này sẽ bị xóa (nếu có thể). -
Files
- lấy một phương thức nhưmismatch()
, lần lượt tìm và trả về vị trí của byte không khớp đầu tiên trong nội dung của hai tệp hoặc -1L nếu không có giá trị không khớp. -
Một lớp mới đã xuất hiện -
CompactNumberFormat
để định dạng số thập phân ở dạng thu gọn. Một ví dụ về dạng thu gọn này là 1M thay vì 1.000.000. Do đó, chỉ cần hai hai thay vì chín ký tự. -
Ngoài ra còn có một cái mới
enum
,NumberFormatStyle
có hai giá trị - DÀI và NGẮN. -
InputStream
có phương thứcskipNBytes(long n)
: bỏ qua số byte thứ n từ luồng đầu vào.
- Java 12 đã có: có gì mới?
- Có gì mới trong Java 12
- Có gì mới trong Java 12 (từ blog Ghi chú của lập trình viên phù thủy)
Java 13
Thế giới không đứng yên, nó chuyển động, nó phát triển, giống như Java - Java 13.Khối văn bản
Java luôn gặp khó khăn một chút khi xác định chuỗi. Nếu chúng tôi cần xác định một dòng có dấu cách, ngắt dòng, trích dẫn hoặc thứ gì khác, điều này gây ra một số khó khăn, vì vậy chúng tôi phải sử dụng các ký tự đặc biệt: ví dụ: \n để ngắt dòng hoặc thoát khỏi một số dòng chính nó. Điều này làm giảm đáng kể khả năng đọc mã và mất thêm thời gian khi viết một dòng như vậy. Điều này trở nên đặc biệt đáng chú ý khi viết các chuỗi hiển thị JSON, XML, HTML, v.v. Kết quả là, nếu chúng ta muốn viết một Json nhỏ, nó sẽ trông giống như thế này:String JSON_STRING = "{\r\n" + "\"name\" : \"someName\",\r\n" + "\"site\" : \"https://www.someSite.com/\"\r\n" + "}";
Và sau đó Java 13 xuất hiện và cung cấp cho chúng ta giải pháp của nó dưới dạng ba dấu ngoặc kép trước và sau văn bản (mà họ gọi là khối văn bản). Hãy xem ví dụ json trước sử dụng cải tiến này:
String TEXT_BLOCK_JSON = """
{
"name" : "someName",
"site" : "https://www.someSite.com/"
}
""";
Đơn giản và rõ ràng hơn nhiều phải không? String
Ba phương pháp mới cũng lần lượt được thêm vào để quản lý các khối này:
stripIndent()
: Loại bỏ các khoảng trắng ngẫu nhiên khỏi một chuỗi. Điều này hữu ích nếu bạn đang đọc các chuỗi nhiều dòng và muốn áp dụng cùng loại loại trừ khoảng trắng ngẫu nhiên xảy ra với một khai báo rõ ràng (về cơ bản là mô phỏng trình biên dịch để loại bỏ khoảng trắng ngẫu nhiên);formatted(Object... args )
: tương tự nhưformat(String format, Object... arg)
, nhưng dành cho khối văn bản;translateEscapes()
: Trả về một chuỗi có các chuỗi thoát (chẳng hạn như \r) được dịch sang giá trị Unicode tương ứng.
Cải thiện chuyển đổi
Các biểu thức chuyển đổi đã được giới thiệu trong Java 12 và 13 đã tinh chỉnh chúng. Trong 12 bạn xác định giá trị trả về bằng cách sử dụng break. Trong 13, giá trị trả về được thay thế bằng lợi nhuận. Bây giờ biểu thức switch mà chúng ta có trong phần Java 12 có thể được viết lại thành:var result = switch (someDay) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(someDay.isEmpty())
yield "Please insert a valid day.";
else
yield "Looks like a Sunday.";
}
};
Mặc dù việc chấp nhận tạm nghỉ là điều bình thường đối với những lập trình viên đã quen thuộc với Java, nhưng điều đó vẫn khá kỳ lạ. Sự thật đang cố nói với tôi là gì? Từ khóa lợi nhuận mới (tương đối mới) rõ ràng hơn và có thể xuất hiện ở những nơi khác trong tương lai nơi các giá trị được trả về. Đối với những người quan tâm sâu sắc đến chủ đề này, tôi khuyên bạn nên tự làm quen với các tài liệu sau:
Lưu trữ CDS động
CDS - Chia sẻ dữ liệu lớp. Cho phép bạn đóng gói một tập hợp các lớp thường được sử dụng vào một kho lưu trữ mà sau này có thể được tải bởi nhiều phiên bản JVM. Tại sao chúng ta cần điều này? Thực tế là trong quá trình tải các lớp, JVM thực hiện khá nhiều hành động tiêu tốn nhiều tài nguyên, chẳng hạn như đọc các lớp, lưu trữ chúng trong cấu trúc bên trong, kiểm tra tính chính xác của các lớp đã đọc, tìm kiếm và tải các lớp phụ thuộc, v.v. ., và chỉ sau tất cả những điều này thì các lớp mới sẵn sàng hoạt động. Có thể hiểu được rằng rất nhiều tài nguyên bị lãng phí vì các phiên bản JVM thường có thể tải các lớp giống nhau. Ví dụ: Chuỗi, LinkedList, Integer. Chà, hoặc các lớp của cùng một ứng dụng và tất cả những thứ này đều là tài nguyên. Nếu chúng tôi thực hiện tất cả các bước cần thiết chỉ một lần rồi đặt các lớp được thiết kế lại vào một kho lưu trữ có thể được tải vào bộ nhớ của một số JVM, thì điều này có thể tiết kiệm đáng kể dung lượng bộ nhớ và giảm thời gian khởi động ứng dụng. Trên thực tế, CDS có thể tạo ra một kho lưu trữ như vậy. Java 9 chỉ cho phép thêm các lớp hệ thống vào kho lưu trữ. Java 10 - bao gồm các lớp ứng dụng trong kho lưu trữ. Việc tạo ra một kho lưu trữ như vậy bao gồm:- tạo danh sách các lớp được ứng dụng tải;
- tạo một kho lưu trữ rất cần thiết với các lớp mà chúng tôi đã tìm thấy.
Cập nhật API ổ cắm
API Socket ( java.net.Socket và java.net.ServerSocket ) về cơ bản là một phần không thể thiếu của Java kể từ khi ra đời, nhưng các socket chưa bao giờ được cập nhật trong hai mươi năm qua. Được viết bằng C và Java, chúng rất, rất cồng kềnh và khó bảo trì. Nhưng Java 13 đã quyết định tự điều chỉnh toàn bộ vấn đề này và thay thế việc triển khai cơ sở. Bây giờ, thay vì PlainSocketImpl, giao diện nhà cung cấp được thay thế bằng NioSocketImpl . Việc triển khai mã hóa mới này dựa trên cơ sở hạ tầng phụ trợ giống như java.nio . Về cơ bản, lớp này sử dụng cơ chế khóa và bộ đệm đệm java.util.concurrent (dựa trên phân đoạn) thay vì các phương thức được đồng bộ hóa. Nó không còn yêu cầu mã gốc nữa, giúp việc chuyển sang các nền tảng khác nhau dễ dàng hơn. Tuy nhiên, chúng ta vẫn có cách để quay lại sử dụng PlainSocketImpl , nhưng từ giờ trở đi NioSocketImpl được sử dụng theo mặc định .Trả lại bộ nhớ cho ZGC
Như chúng ta đã nhớ, trình thu gom rác Z đã được giới thiệu trong Java 11 dưới dạng cơ chế thu gom rác có độ trễ thấp để thời gian tạm dừng GC không bao giờ vượt quá 10 mili giây. Nhưng đồng thời, không giống như các GC HotSpots ảo khác, chẳng hạn như Shenandoah và G1, nó có thể trả lại bộ nhớ động chưa sử dụng cho HĐH. Sửa đổi này bổ sung khả năng J này cho ZGC. Theo đó, chúng tôi giảm dung lượng bộ nhớ cùng với hiệu suất được cải thiện và ZGC hiện trả lại bộ nhớ chưa được cam kết cho hệ điều hành theo mặc định cho đến khi đạt được kích thước vùng nhớ heap tối thiểu được chỉ định. Một điều nữa: ZGC hiện có kích thước heap được hỗ trợ tối đa là 16 TB. Trước đây, 4TB là giới hạn. Những đổi mới khác:javax.security
- đã thêm thuộc tínhjdk.sasl.disabledMechanisms
để vô hiệu hóa cơ chế SASL.java.nio
- một phương thức đã được thêm vàoFileSystems.newFileSystem (Path, Map <String,?>)
- tương ứng, để tạo một tệp mới.- Các lớp
java.nio
bây giờ có các phương thức tuyệt đối (ngược lại với tương đối)get
vàset
-. Chúng, giống như lớp trừu tượng cơ sởBuffer
, bao gồm một phương thứcslice()
để truy xuất một phần bộ đệm. - Đã thêm
javax.xml.parsers
các phương thức để khởi tạo các nhà máy DOM và SAX (có hỗ trợ không gian tên). - Hỗ trợ Unicode đã được cập nhật lên phiên bản 12.1.
- Java 13: Tính năng mới
- Tất cả về Java 13: đi sâu vào thế giới cập nhật
- 81 tính năng và API mới trong JDK 13
GO TO FULL VERSION