JDK 12: Fitur baru di Java 12

Rilis produksi Java Development Kit 12, berdasarkan Java SE (Edisi Standar) 12, sekarang tersedia. Build JDK 12 tersedia dari Oracle untuk Linux, Windows, dan MacOS. 

Tempat mengunduh JDK 12

Anda dapat mengunduh JDK 12 dari situs web Java.net.

Build open source disediakan di bawah GNU General Public License v2, dengan Classpath Exception. Build komersial JDK 12 dari Oracle dapat ditemukan di jaringan Oracle Technology di bawah lisensi non-open source.

Fitur baru di Java 12

Pengumpul sampah Shenandoah

Java 12 menambahkan Shenandoah, algoritme pengumpulan sampah eksperimental, untuk mengurangi waktu jeda pengumpulan sampah dengan melakukan pekerjaan evakuasi secara bersamaan dengan menjalankan thread Java. Shenandoah menyediakan algoritma yang sesuai untuk aplikasi yang menghargai daya tanggap dan jeda singkat yang dapat diprediksi. Namun, tujuannya bukan untuk memperbaiki semua masalah jeda JVM.

Red Hat saat ini mendukung Shenandoah pada arsitektur Aarch64 dan AMD64.

Koleksi campuran yang dapat dibatalkan untuk pengumpul sampah G1

Java 12 membuat koleksi campuran G1 dapat dibatalkan jika mungkin melebihi target jeda. Sasaran G1 adalah memenuhi target waktu jeda yang disediakan pengguna untuk jeda pengumpulannya.

Sebelumnya, mesin analisis lanjutan memilih jumlah pekerjaan yang harus diselesaikan selama pengumpulan. Hasilnya adalah seperangkat wilayah yang dikenal sebagai kumpulan kumpulan. Setelah kumpulan ditentukan dan pengumpulan dimulai, G1 mengumpulkan semua objek langsung di wilayah koleksi di semua wilayah tanpa henti. Namun hal ini dapat menyebabkan G1 melebihi target waktu jeda jika heuristik aplikasi memilih kumpulan kumpulan yang terlalu besar.

Mekanisme diperlukan untuk mendeteksi ketika heuristik berulang kali memilih jumlah pekerjaan yang salah untuk koleksi dan, jika ini terjadi, meminta G1 melakukan pekerjaan pengumpulan secara bertahap dalam langkah-langkah, di mana koleksi dapat dibatalkan setelah setiap langkah. Mekanisme yang diperkenalkan di Java 12 memungkinkan G1 memenuhi tujuan waktu jeda lebih sering.

Pengembalian segera dari memori komitmen yang tidak digunakan

Java 12 menyempurnakan G1 agar secara otomatis mengembalikan memori heap Java ke sistem operasi saat idle. Memori ini dilepaskan dalam periode waktu yang wajar saat aktivitas aplikasi sangat rendah.

Sebelumnya, G1 hanya mengembalikan memori dari heap pada pengumpulan sampah penuh atau selama siklus bersamaan. Dengan mencoba menghindari pengumpulan sampah secara penuh, G1 hanya memicu siklus bersamaan berdasarkan penempatan heap dan aktivitas alokasi, G1 tidak akan mengembalikan memori heap dalam banyak kasus kecuali dipaksa untuk melakukannya secara eksternal. Perilaku ini merugikan dalam lingkungan kontainer di mana sumber daya dibayar dengan penggunaan. Bahkan jika JVM hanya menggunakan sebagian kecil dari memori yang ditetapkan karena tidak aktif, G1 mempertahankan heap penuh. Jadi, pelanggan membayar semua sumber daya sepanjang waktu, dan penyedia cloud tidak dapat menggunakan perangkat keras mereka sepenuhnya.

Dengan Java 12, JVM dapat mendeteksi fase penggunaan heap yang kurang dan secara otomatis mengurangi penggunaan heap selama waktu tersebut. 

API konstanta JVM

API ini memodelkan deskripsi nominal file kelas kunci dan artefak waktu proses, terutama konstanta yang dapat dimuat dari kumpulan konstan. Java 12 mendefinisikan keluarga tipe referensi simbolis berbasis nilai dalam sebuah paket baru java.lang.invoke.constant,, untuk mendeskripsikan setiap jenis konstanta yang dapat dimuat.

Kumpulan konstan ada di setiap kelas Java, menyimpan instruksi operan dan bytecode di kelas tersebut. Entri dalam kumpulan konstan menjelaskan artefak waktu proses seperti kelas dan metode atau nilai sederhana seperti string dan bilangan bulat. Entri ini dikenal sebagai konstanta yang dapat dimuat.

Program yang memanipulasi file kelas harus memodelkan instruksi bytecode dan pada gilirannya dapat memuat konstanta. Tetapi menggunakan tipe Java standar untuk membuat model konstanta yang dapat dimuat tidaklah memadai. Ini mungkin dapat diterima untuk konstanta yang dapat dimuat yang mendeskripsikan string, tetapi bermasalah untuk konstanta yang dapat dimuat yang mendeskripsikan kelas, karena menghasilkan objek "langsung" Classbergantung pada kebenaran dan konsistensi pemuatan kelas. Pemuatan kelas, bagaimanapun, memiliki banyak ketergantungan lingkungan dan mode kegagalan.

Jadi, program yang berurusan dengan konstanta yang dapat dimuat dapat disederhanakan jika mereka dapat memanipulasi kelas dan metode dan artefak yang kurang dikenal seperti pegangan metode dan konstanta yang dihitung secara dinamis dalam bentuk simbolik nominal. Jadi, API konstanta JVM memberi pustaka dan alat satu cara standar untuk mendeskripsikan konstanta yang dapat dimuat.

Penyempurnaan startup, CDS, dan pengumpulan sampah

Java 12 menyempurnakan proses build JDK untuk menghasilkan arsip berbagi data kelas (CDS) default, menggunakan daftar kelas default, pada platform 64-bit. Ini meningkatkan waktu startup out-of-the-box dan menghilangkan kebutuhan untuk menjalankan -Xshare:dumpuntuk mendapatkan keuntungan dari CDS. Proses pembuatan JDK telah dimodifikasi untuk dijalankan java-xshare:dumpsetelah menautkan gambar.

Opsi baris perintah tambahan telah disertakan untuk menyesuaikan waktu heap pengumpulan sampah guna meningkatkan tata letak memori untuk kasus umum. Pengguna dengan persyaratan lebih lanjut, seperti daftar kelas kustom yang menyertakan kelas aplikasi dan konfigurasi pengumpulan sampah yang berbeda, masih dapat membuat arsip CDS kustom.

Jumlah port ARM berkurang

Java 12 menghapus semua sumber yang terkait dengan arm64port sambil tetap mempertahankan ARM 32-bit dan 64-bit aarch64. Penghapusan port ini akan memungkinkan kontributor memfokuskan upaya pada implementasi ARM 64-bit tunggal dan menghilangkan pekerjaan duplikat yang akan dihasilkan dari pemeliharaan dua port. Saat ini, dua port ARM 64-bit ada di JDK.

Ganti ekspresi

Tukar ekspresi menyederhanakan pengkodean dengan memperluas switchpernyataan sehingga dapat digunakan sebagai pernyataan atau ekspresi. Hal ini memungkinkan pernyataan dan ekspresi untuk menggunakan perilaku pelingkupan "tradisional" atau "sederhana" dan aliran kontrol. Perubahan ini menghasilkan pengkodean "sehari-hari" yang lebih sederhana dan mempersiapkan cara untuk penggunaan pencocokan pola di switch.

Saat pembangun Java bergerak untuk mendukung pencocokan pola, ketidakteraturan switchpernyataan Java  telah menjadi penghalang. Ini termasuk perilaku aliran kontrol default dari blok sakelar; cakupan default dari blok sakelar, di mana blok tersebut diperlakukan sebagai satu ruang lingkup; dan beralih bekerja hanya sebagai pernyataan. Desain switchpernyataan Java saat ini sangat dekat dengan bahasa seperti C ++ dan, secara default, mendukung semantik fallthrough. Alur kontrol ini berguna untuk menulis kode tingkat rendah. Tetapi ketika sakelar digunakan dalam konteks tingkat yang lebih tinggi, sifat rawan kesalahannya mulai melebihi fleksibilitasnya.

Rangkaian benchmark dasar

JDK 12 menyertakan rangkaian dasar microbenchmark, yang telah ditambahkan ke kode sumber platform. Tujuannya adalah untuk memudahkan pengembang dalam menjalankan tolok ukur yang ada atau membuat yang baru.

Proposal rangkaian microbenchmark, dibuat pada Juli 2014 dan diperbarui pada awal November 2018, didukung oleh Java Microbenchmark Harness (JMH), untuk membuat benchmark yang ditulis dalam Java dan bahasa JVM lainnya. Rangkaian ini ditempatkan dengan kode sumber JDK dalam satu direktori, dengan pengembang dapat dengan mudah menambahkan tolok ukur baru.

Bukan tujuan untuk memberikan tolok ukur untuk fitur JDK baru atau membuat satu set lengkap tolok ukur yang mencakup semua yang ada di JDK. Perhatikan juga bahwa rangkaian pembandingan tidak diperlukan untuk build JDK biasa, tetapi merupakan target build terpisah. 

Proposal meminta pembuatan halaman baru di wiki.openjdk.java.net untuk menjelaskan cara mengembangkan tolok ukur dan menjelaskan persyaratan. Persyaratan ini akan mengamanatkan kepatuhan terhadap standar pengkodean, kinerja yang dapat direproduksi, dan dokumentasi.

Pembaruan JDK 12

JDK 12 direncanakan untuk menerima dua pembaruan sebelum digantikan oleh JDK 13 dalam enam bulan. JDK 12 adalah bagian dari irama rilis enam bulan Oracle yang diperkenalkan dengan JDK 9 pada September 2017. JDK 12 dicirikan sebagai rilis fitur, tidak seperti JDK 11, yang merupakan rilis dukungan jangka panjang dengan rencana dukungan selama beberapa tahun.