Halo, Habr! Saya sajikan kepada Anda terjemahan artikel " 90 Fitur Baru (dan API) di JDK 11 " oleh Simon Ritter.

Bagi banyak orang, siklus rilis JDK enam bulan yang baru berarti bahwa beberapa belum mengetahui apa fitur baru di JDK 10, dan JDK 11 berada di ambang. Dalam salah satu blog awal , semua 109 fitur baru dan API terdaftar yang berhasil ditemukan di JDK 10. Oleh karena itu, untuk JDK 11 diputuskan untuk melakukan hal yang sama. Namun, format yang berbeda dipilih. Posting ini akan dibagi menjadi dua bagian: fitur baru yang tersedia untuk pengembang (API publik) dan yang lainnya. Jadi, jika Anda hanya tertarik pada apa yang secara langsung mempengaruhi perkembangan Anda, Anda dapat melewati bagian kedua.
Jumlah total perubahan yang dapat dihitung ternyata 90 (ini adalah JEP plus kelas dan metode baru, tidak termasuk metode terpisah untuk klien HTTP dan Perekam Penerbangan ) ( catatan penerjemah: Java Flight Recorder (JFR) adalah salah satu add-on bawaan Oracle di JDK, tetapi dimulai dengan Java 11, terima kasih kepada JEP 328 , itu dipindahkan ke open source) . Meskipun JDK 11 berhasil menemukan sebelas perubahan kurang dari pada JDK 10, saya pikir itu adil untuk mengatakan bahwa lebih banyak fungsi telah ditambahkan ke JDK 11, pasti di tingkat JVM.
Fitur baru yang terlihat oleh pengembang
JDK 11 memiliki beberapa perubahan yang dapat memengaruhi gaya pengembangan. Ada sedikit perubahan sintaksis, banyak API baru dan kemampuan untuk menjalankan aplikasi dalam satu file tanpa menggunakan kompiler ( note translator: file shebang disebut ). Selain itu, perubahan besar (dan putus) adalah penghapusan modul agregasi java.se.ee , yang dapat mempengaruhi migrasi aplikasi yang ada ke JDK 11.
JEP 323: Sintaks Variabel Lokal untuk Parameter Lambda
Dalam JDK 10, inferensi variabel lokal (atau inferensi tipe) diperkenalkan ( JEP 286 ). Ini menyederhanakan kode karena Anda tidak perlu lagi secara eksplisit menentukan jenis variabel lokal, Anda dapat menggunakan var sebagai gantinya. JEP 323 memperluas penggunaan sintaks ini, yang sekarang juga berlaku untuk parameter ekspresi lambda. Contoh sederhana:
list.stream() .map((var s) -> s.toLowerCase()) .collect(Collectors.toList());
Seorang programmer Java yang penuh perhatian akan menunjukkan bahwa ekspresi lambda sudah memiliki tipe inferensi, jadi menggunakan var akan (dalam hal ini) berlebihan. Kita bisa dengan mudah menulis kode yang sama dengan:
list.stream() .map(s -> s.toLowerCase()) .collect(Collectors.toList());
Mengapa menambahkan dukungan var? Jawabannya adalah satu kasus khusus - ketika Anda ingin menambahkan anotasi ke parameter lambda. Ini tidak dapat dilakukan tanpa jenis keterlibatan apa pun. Untuk menghindari penggunaan tipe eksplisit, kita bisa menggunakan var untuk menyederhanakan banyak hal, dengan cara ini:
list.stream() .map((@Notnull var s) -> s.toLowerCase()) .collect(Collectors.toList());
Perubahan ini membutuhkan perubahan pada Spesifikasi Bahasa Jawa (JLS) , khususnya:
Halaman 24: Deskripsi pengidentifikasi khusus var.
Halaman 627-630: Parameter Lambda
Halaman 636: Evaluasi Runtime dari ekspresi Lambda
Halaman 746: Sintaks Lambda
JEP 330: Luncurkan Program Kode-Sumber File Tunggal
Salah satu kritik terhadap Jawa adalah redundansi sintaksis, dan "upacara" yang terkait dengan peluncuran bahkan aplikasi sepele dapat secara serius meningkatkan ambang masuk bagi pemula. Untuk menulis aplikasi yang hanya mencetak "Hello World!", Anda harus menulis kelas dengan metode utama public static void dan menggunakan metode System.out.println (). Setelah melakukan ini, Anda harus mengkompilasi kode menggunakan javac. Akhirnya, Anda dapat meluncurkan aplikasi yang akan menyambut dunia. Menjalankan skrip yang sama dalam sebagian besar bahasa modern jauh lebih sederhana dan lebih cepat.
JEP 330 menghilangkan kebutuhan untuk mengkompilasi aplikasi file tunggal. Sekarang cukup masukkan:
java HelloWorld.java
Peluncur Java mengidentifikasi bahwa file tersebut berisi kode sumber Java dan mengkompilasi kode tersebut ke file * .class sebelum menjalankannya.
Argumen ditempatkan setelah nama file sumber diberikan sebagai argumen ketika aplikasi dimulai. Argumen ditempatkan sebelum nama file sumber dilewatkan sebagai argumen ke peluncur java setelah kompilasi kode (ini memungkinkan Anda untuk mengatur hal-hal seperti classpath pada baris perintah). Argumen yang terkait dengan kompiler (mis. Classpath) juga akan diteruskan ke javac untuk kompilasi.
Contoh:
java -classpath /home/foo/java Hello.java Bonjour
Itu akan setara dengan:
javac -classpath /home/foo/java Hello.java java -classpath /home/foo/java Hello Bonjour
JEP ini juga menyediakan dukungan untuk file shebang. Untuk mengurangi perlunya menyebutkan java launcher di baris perintah, Anda dapat memasukkannya di baris pertama file sumber. Sebagai contoh:
#!/usr/bin/java --source 11 public class HelloWorld { ...
Diperlukan flag -sumber dengan versi Java yang digunakan.
JEP 321: Klien HTTP (Standar)
JDK 9 memperkenalkan API baru untuk mendukung protokol HTTP Client ( JEP 110 ). Karena JDK 9 menyediakan Java Platform Module System (JPMS) , API ini dimasukkan sebagai modul inkubator . Modul inkubator dirancang untuk menyediakan API baru, tetapi tidak mengubahnya menjadi standar Java SE. Pengembang dapat mencoba API dengan memberikan umpan balik. Setelah melakukan perubahan yang diperlukan (API ini diperbarui di JDK 10), API dapat ditransfer ke modul utama untuk menjadi bagian dari standar.
HTTP Client API sekarang merupakan bagian dari standar Java SE 11. Ini memperkenalkan modul dan paket baru untuk JDK, java.net.http . Kelas utama:
- Httpclient
- Httprequest
- HttpResponse
- Soket web
API dapat digunakan secara sinkron atau asinkron. Dalam mode asinkron, CompletionFutures dan CompletionStages digunakan.
JEP 320: Hapus Modul Java EE dan CORBA
Dengan diperkenalkannya JPMS di JDK 9, dimungkinkan untuk membagi file rt.jar monolitik menjadi beberapa modul. Manfaat tambahan dari JPMS adalah sekarang Anda dapat membuat lingkungan runtime Java yang hanya mencakup modul yang diperlukan untuk aplikasi Anda, sangat mengurangi ukuran keseluruhan. Dengan batasan yang jelas, modul usang sekarang lebih mudah untuk dihapus dari Java API. Inilah yang dilakukan JEP ini; Modul meta java.se.ee mencakup enam modul yang tidak lagi menjadi bagian dari standar Java SE 11 dan tidak akan dimasukkan dalam JDK.
Modul Jarak Jauh:
- corba ( catatan penerjemah:
beristirahat dengan tenang , bakar di neraka ) - transaksi
- aktivasi
- xml.bind
- xml.ws
- xml.ws.annotation
Modul-modul ini telah ditandai usang (@Deprecated) sejak JDK 9 dan tidak disertakan secara default dalam kompilasi atau runtime. Jika Anda mencoba mengompilasi atau menjalankan aplikasi menggunakan API dari modul-modul ini pada JDK 9 atau JDK 10, maka Anda akan gagal. Jika Anda menggunakan API dari modul-modul ini dalam kode Anda, Anda harus menyediakannya sebagai modul atau pustaka yang terpisah. Dilihat oleh ulasan, tampaknya bahwa modul java.xml yang merupakan bagian dari JAX-WS, dukungan layanan web SOAP adalah orang-orang yang akan menyebabkan sebagian besar masalah.
API publik baru
Banyak API baru di JDK 11 adalah hasil dari kenyataan bahwa modul klien HTTP sekarang menjadi bagian dari standar, serta dimasukkannya Perekam Penerbangan.
Daftar skema lengkap perubahan API, termasuk perbandingan berbagai versi JDK, dapat ditemukan di sini.
Tercantum di sini adalah semua metode baru selain yang terdapat dalam modul java.net.http dan jdk.jfr. Juga tidak terdaftar adalah metode dan kelas baru dalam modul java.security, yang cukup spesifik untuk perubahan JEP 324 dan JEP 329 (ada enam kelas baru dan delapan metode baru).
java.io.ByteArrayOutputStream
- membatalkan writeBytes (byte []) : menulis semua byte dari argumen ke OutputStream
java.io.FileReader
Dua konstruktor baru yang memungkinkan Anda menentukan Charset.
java.io.FileWriter
Empat konstruktor baru yang memungkinkan Anda menentukan Charset.
- io.InputStream nullInputStream () : mengembalikan InputStream yang tidak membaca byte. Melihat metode ini (dan yang ada di OutputStream, Reader, dan Writer), muncul pertanyaan mengapa itu mungkin berguna. Anda dapat menganggapnya sebagai / dev / null - untuk membuang output yang tidak Anda butuhkan, atau memberikan input yang selalu mengembalikan byte nol.
java.io.OutputStream
- io.OutputStream nullOutputStream ()
java.io.Reader
java.io.Writer
java.lang.Character
- String toString (int) : Ini adalah bentuk overload dari metode yang sudah ada, tetapi int digunakan sebagai ganti char. Int adalah titik kode Unicode.
java.lang.CharSequence
- int bandingkan (CharSequence, CharSequence) : membandingkan dua contoh CharSequence secara leksikografis . Mengembalikan nilai negatif, nol, atau nilai positif jika urutan pertama kurang leksikografis, sama dengan, atau lebih besar dari yang kedua.
referensi java.lang.ref.
- lang.Object clone () : Saya harus mengakui, perubahan ini menyebabkan kebingungan. Kelas referensi tidak mengimplementasikan antarmuka Cloneable, dan metode ini melempar CloneNotSupportedException. Pasti ada alasan untuk dimasukkan, mungkin untuk sesuatu di masa depan. ( Catatan Penerjemah: ada diskusi tentang StackOverflow , tiket di OpenJDK )
java.lang.Runtime
java.lang.System
Tidak ada metode baru di sini, tetapi perlu disebutkan bahwa metode runFinalizersOnExit () sekarang dihapus dari kedua kelas (mungkin ada masalah ketika bermigrasi ke JDK 11).
java.lang.String
Saya pikir ini adalah salah satu highlights dari API baru di JDK 11. Ada beberapa metode baru yang berguna di sini.
- boolean isBlank () : mengembalikan true jika string kosong atau hanya berisi spasi, jika tidak palsu.
- Aliran garis () : mengembalikan Aliran dari String, diekstraksi dari string ini, dipisahkan oleh pemisah garis.
- String repeat (int) : mengembalikan string yang nilainya merupakan gabungan dari string ini, diulang beberapa kali.
- String strip () : Mengembalikan string yang nilainya string ini, ini menghapus semua spasi di awal dan akhir string.
- String stripLeading () : mengembalikan string yang nilainya string ini, sambil menghapus semua spasi di awal baris.
- String stripTrailing () : mengembalikan string yang nilainya string ini, ini menghapus semua spasi di akhir string.
Kemungkinan besar, Anda melihat strip () dan bertanya: "Apa bedanya dengan metode trim () yang ada?" Jawabannya terletak pada perbedaan dalam mendefinisikan ruang. ( catatan penerjemah: singkatnya, strip () memahami Unicode lebih baik, analisis terperinci tentang StackOverflow )
java.lang.StringBuffer
java.lang.StringBuilder
Kedua kelas ini memiliki metode compareTo () baru yang menggunakan StringBuffer / StringBuilder dan mengembalikan int. Metode perbandingan leksikal mirip dengan metode compareTo () baru di CharSequence.
java.lang.Thread
Tidak ada metode baru. Metode destroy () dan stop (Throwable) telah dihapus. Metode stop () , yang tidak menggunakan argumen, masih ada. Dapat menyebabkan masalah kompatibilitas.
java.nio.ByteBuffer
java.nio.CharBuffer
java.nio.DoubleBuffer
java.nio.FloatBuffer
java.nio.LongBuffer
java.nio.ShortBuffer
Semua kelas ini sekarang memiliki metode mismatch () , yang menemukan dan mengembalikan indeks relatif ketidakcocokan pertama antara buffer ini dan buffer yang diteruskan.
java.nio.channels.SelectionKey
- int interestOpsAnd (int) : Secara teoritis menetapkan minat kunci ini (minat kunci) ke persimpangan bitwise ("dan") dari rangkaian minat yang ada dan nilai yang diteruskan.
- int interestOpsOr (int) : Secara teoritis menetapkan minat kunci ini (bunga kunci) dalam bitwise union ("atau") dari rangkaian minat yang ada dan nilai yang diteruskan.
java.nio.channels.Selector
- int select (java.util.function.Consumer, long) : pilih dan lakukan tindakan pada tombol yang salurannya sesuai untuk operasi I / O. argumen panjang adalah batas waktu.
- pilih int (java.util.function.Consumer) : sama seperti di atas, tetapi tanpa batas waktu.
- int selectNow (java.util.function.Consumer) : sama seperti di atas, hanya non-blocking.
java.nio.file.Files
- String readString (Path) : membaca semua konten dari file menjadi string, mendekode dari byte ke karakter menggunakan pengkodean UTF-8.
- String readString (Path, Charset) : seperti yang ditunjukkan di atas, dengan perbedaan bahwa decoding dari byte ke karakter terjadi menggunakan Charset yang ditentukan.
- Path writeString (Path, CharSequence, java.nio.file.OpenOption []) : Tulis CharSequence ke file. Karakter dikodekan dalam byte menggunakan pengkodean UTF-8.
- Path writeString (Path, CharSequence, java.nio.file.Charset, OpenOption []) : sama seperti di atas, karakter dikodekan dalam byte menggunakan pengkodean yang ditentukan dalam Charset.
java.nio.file.Path
- Path of (String, String []) : mengembalikan Path dari argumen string dari path atau urutan string yang, ketika digabungkan, membentuk string path.
- Path of (net.URI) : mengembalikan Path dari URI.
java.util.Collection
- Objek [] toArray (java.util.function.IntFunction) : mengembalikan array yang berisi semua elemen dalam koleksi ini, menggunakan fungsi generasi yang disediakan untuk mengalokasikan array yang dikembalikan.
java.util.concurrent.PriorityBlockingQueue
java.util.PriorityQueue
- void forEach (java.util.function.Consumer) : Melakukan aksi yang diteruskan untuk setiap elemen yang dapat diulangi hingga semua elemen diproses atau tindakan tersebut membuat pengecualian.
- boolean removeAll (java.util.Collection) : menghapus semua elemen koleksi ini yang juga terkandung dalam koleksi yang ditentukan (operasi opsional).
- boolean removeIf (java.util.function.Predicate) : Menghapus semua elemen dari koleksi ini yang memenuhi predikat yang diberikan.
- boolean retainAll (java.util.Collection) : Menyimpan hanya elemen-elemen dalam koleksi ini yang terkandung dalam koleksi yang ditransfer (operasi opsional).
java.util.concurrent.TimeUnit
- long convert (java.time.Duration) : mengkonversi Durasi yang dilewati ke jenis ini.
java.util.function.Predicate
- Predikat tidak (Predikat) : Mengembalikan predikat, yang merupakan negasi dari predikat yang ditransmisikan.
Ini adalah salah satu API baru favorit saya di JDK 11. Sebagai contoh, Anda dapat mengonversi kode ini:
lines.stream() .filter(s -> !s.isBlank())
masuk
lines.stream() .filter(Predicate.not(String::isBlank))
atau jika kami menggunakan impor statis:
lines.stream() .filter(not(String::isBlank))
Secara pribadi, saya percaya bahwa versi ini lebih mudah dipahami dan ringkas.
java.util.Optional
java.util.OptionalInt
java.util.OptionalDouble
java.util.OptionalLong
- boolean isEmpty () : Jika tidak ada nilai, mengembalikan true, jika tidak, false.
java.util.regex.Pattern
- Predikat asMatchPredicate () : Saya pikir itu mungkin permata dari JDK 11. API baru. Membuat predikat yang memeriksa apakah templat ini cocok dengan string input yang diberikan.
java.util.zip.Deflater
int deflate (ByteBuffer) : kompres input dan isi buffer yang ditentukan dengannya.
int deflate (ByteBuffer, int) : kompres input dan isi buffer yang ditentukan dengannya. Mengembalikan jumlah aktual dari data yang dikompresi.
void setDictionary (ByteBuffer) : Menetapkan kamus yang ditentukan untuk kompresi ke byte di buffer ini. Ini adalah bentuk kelebihan dari metode yang sudah ada yang bisa diterima ByteBuffer, bukan array byte.
void setInput (ByteBuffer) : Mengatur input yang akan dikompres. Juga merupakan bentuk kelebihan dari metode yang ada.
java.util.zip.Inflater
- int inflate (ByteBuffer) : mendekompresi byte ke buffer yang ditentukan. Mengembalikan jumlah byte aktual yang tidak di-zip.
- void setDictionary (ByteBuffer) : Mengatur kamus yang ditentukan ke byte di buffer ini. Bentuk kelebihan dari metode yang ada.
- membatalkan setInput (ByteBuffer) : Mengatur input untuk dekompresi. Bentuk kelebihan dari metode yang ada.
javax.print.attribute.standard.DialogOwner
Ini adalah kelas baru di JDK 11. Digunakan untuk mendukung permintaan dialog cetak atau pengaturan halaman. Harus ditampilkan di atas semua jendela atau jendela tertentu.
javax.swing.DefaultComboBoxModel
javax.swing.DefaultListModel
- membatalkan addAll (Koleksi) : menambahkan semua elemen yang ada dalam koleksi.
- membatalkan addAll (int, Collection) : menambahkan semua elemen yang ada dalam koleksi, mulai dari indeks yang ditentukan.
javax.swing.ListSelectionModel
- int [] getSelectedIndices () : Mengembalikan array semua indeks yang dipilih dalam model yang dipilih, dalam urutan menaik.
- int getSelectedItemsCount () : Mengembalikan jumlah item yang dipilih.
jdk.jshell.EvalException
- jshell.JShellException getCause () : mengembalikan pembungkus penyebab yang dapat dibuang di klien eksekusi yang diwakili oleh EvalException, atau nol jika penyebabnya tidak ada atau tidak diketahui.
Fitur baru (bukan API publik)
JEP 181: Kontrol Akses Berbasis Sarang
Java (dan bahasa lainnya) mendukung kelas bersarang melalui kelas dalam. Untuk operasi yang benar, kompiler harus melakukan beberapa trik. Sebagai contoh:
public class Outer { private int outerInt; class Inner { public void printOuterInt() { System.out.println("Outer int = " + outerInt); } } }
Kompiler memodifikasi ini untuk membuat sesuatu seperti ini sebelum melakukan kompilasi:
public class Outer { private int outerInt; public int access$000() { return outerInt; } }
class Inner$Outer { Outer outer; public void printOuterInt() { System.out.println("Outer int = " + outer.access$000()); } }
Meskipun, secara logis, kelas dalam adalah bagian dari kode yang sama dengan kelas luar, itu dikompilasi sebagai kelas terpisah. Oleh karena itu, ini memerlukan metode sintetis ("jembatan"), yang harus dibuat oleh kompiler untuk memberikan akses ke bidang pribadi kelas eksternal.
JEP ini mewakili konsep "soket", di mana dua anggota soket yang sama (Luar dan Dalam dari contoh kami) adalah tetangga. Dua atribut baru ditambahkan dalam format file * .class: NestHost dan NestMembers. Perubahan ini juga berguna untuk bahasa yang dikompilasi bytecode lain yang mendukung kelas bersarang.
Fitur ini menyediakan tiga metode baru untuk java.lang.Class:
- Kelas getNestHost ()
- Kelas [] getNestMembers ()
- boolean isNestmateOf (clazz)
Fitur ini juga memerlukan perubahan pada Spesifikasi Mesin Virtual Java (JVMS) , khususnya di bagian 5.4.4 Kontrol Akses.
JEP 309: Konstanta File-Kelas Dinamis
JEP ini menjelaskan ekstensi format file * .class untuk mendukung formulir baru dengan kumpulan konstan CONSTANT_Dynamic (sering disebut sebagai condy dalam presentasi). Gagasan tentang konstanta dinamis tampaknya merupakan sebuah oxymoron, tetapi, pada kenyataannya, Anda dapat menganggapnya sebagai nilai akhir di Jawa. Nilai pool konstan tidak diatur pada tahap kompilasi (tidak seperti konstanta lain), tetapi metode bootstrap digunakan untuk menentukan nilai pada saat run time. Oleh karena itu, nilainya dinamis, tetapi karena nilainya hanya ditetapkan satu kali, nilainya juga konstan.
Fitur ini terutama bermanfaat bagi mereka yang sedang mengembangkan bahasa dan kompiler baru. Siapa yang akan menghasilkan bytecode dan * .class file untuk dijalankan di JVM. Ini akan menyederhanakan beberapa tugas.
Fitur ini menyediakan kelas java.lang.invoke.ConstantBootstraps baru dengan sembilan metode baru. Saya tidak akan mencantumkan semuanya di sini; ini adalah metode bootstrap untuk konstanta yang dihitung secara dinamis.
Fitur ini memerlukan perubahan pada JVMS, khususnya, dalam cara menggunakan kode byte khusus dan bagian 4.4 dari Constant Pool.
JEP 315: Tingkatkan Aarch64 Intrinsics
Ini adalah JEP yang disumbangkan oleh Red Hat. JVM sekarang dapat menggunakan instruksi khusus yang tersedia di set perintah Arm 64. Secara khusus, ini meningkatkan operasi metode sin (), cos (), dan log () dari kelas java.lang.Math.
JEP 318: Pengumpul Sampah Epsilon
Red Hat juga berkontribusi pada JEP ini. Pengumpul sampah Epsilon agak tidak biasa karena tidak mengumpulkan sampah! Ini akan mengalokasikan memori baru jika perlu saat membuat objek baru, tetapi tidak membebaskan ruang yang ditempati oleh objek tanpa tautan.
Jadi, apa gunanya? Setidaknya ada dua kegunaan:
- Pertama-tama, kolektor ini dirancang untuk memastikan bahwa algoritma GC baru dievaluasi dalam hal dampaknya terhadap kinerja. Idenya adalah menjalankan contoh aplikasi dengan Epsilon GC dan menghasilkan metrik. Algoritma GC baru dimasukkan, tes yang sama dijalankan dan hasilnya dibandingkan.
- Untuk tugas yang sangat singkat atau berumur pendek (pikirkan fungsi serverless di cloud), di mana Anda dapat memastikan bahwa Anda tidak melebihi memori yang dialokasikan untuk menumpuk ruang. Ini dapat meningkatkan kinerja dengan menghilangkan overhead (termasuk mengumpulkan statistik yang diperlukan untuk memutuskan apakah akan menjalankan collector) dalam kode aplikasi.
Jika ruang tumpukan habis, operasi JVM selanjutnya dapat dikonfigurasi dalam salah satu dari tiga cara:
- OutOfMemoryError biasa disebut.
- Reset Heap
- Sulit menghentikan JVM dan mungkin melakukan tugas eksternal (misalnya, memulai debugger).
JEP 324: Perjanjian Utama dengan Curve25519 dan Curve448
Standar kriptografi terus berubah dan membaik. Dalam hal ini, skema Diffie-Hellman yang ada dengan kurva elips digantikan oleh Curve25519 dan Curve448. Ini adalah skema perjanjian utama yang ditentukan dalam RFC-7748.
JEP 327: Unicode 10
Platform Java mendukung Unicode untuk memungkinkan pemrosesan semua set karakter. Karena Unicode telah diperbarui ke versi 10 , JDK juga telah diperbarui untuk mendukung versi standar ini.
Saya selalu tertarik untuk melihat apa yang dimasukkan pengembang Unicode dalam versi baru. Unicode 10 memiliki 8.518 karakter baru. Ini termasuk simbol Bitcoin, rangkaian karakter Nüshu (digunakan oleh wanita Cina untuk menulis puisi), dan Soyombo dan Zanabazar Square (adalah karakter yang digunakan dalam teks historis Buddha untuk menulis bahasa Sanskerta, Tibet, dan Mongolia). Banyak Emoji lain juga telah ditambahkan, termasuk Colbert Emoji yang telah lama ditunggu-tunggu.
Ingat, dimulai dengan JDK 9, Anda dapat menggunakan UTF-8 dalam file properti (.properties). Ini berarti bahwa setiap karakter Unicode dapat digunakan dalam file tersebut. Termasuk Emoji. Atau Nüshu.
JEP 328: Perekam Penerbangan
Flight Recorder — JVM. JDK 11 Oracle JDK. , Oracle Oracle JDK OpenJDK, OpenJDK.
JEP :
: jdk.jfr jdk.management.jfr.
JEP 329: ChaCha20 and Poly1305 Cryptographic Algorithms
JEP 324, , JDK. ChaCha20 ChaCha20-Poly1305, RFC 7539. ChaCha20 — , , RC4.
JEP 331: Low-overhead Heap Profiling
, JEP, Google. Java JVM.
:
JEP 332: Transport Layer Security (TLS) 1.3
TLS 1.3 (RFC 8446) " " TLS . JDK , Datagram Transport Layer Security (DTLS).
JEP 333: ZGC A Scalable, Low Latency Garbage Collector
, , () . ( , Weak Generational Hypothesis ) ( ) GC . "" , . .
ZGC — region-based ( G1), NUMA aware compacting . .
pauseless , C4 Zing JVM.
JEP 335: Deprecate the Nashorn Scripting Engine
Nashorn JDK 8 Rhino Javascript . , Nashorn API jjs Java. , . Graal VM , , .
JEP 336: Deprecate the Pack200 Tools and APIs
Pack200 — JAR-, Java SE 5.0. JPMS JDK 9 Pack200 JDK. pack200 unpack200 API Pack200 java.util.jar JDK. , .
Kesimpulan
JDK 11 — LTS JDK ( ). , , , , JVM , .
Zulu JDK 11 !
JDK 11?
( . : , )