JavaRush /Blog Java /Random-MS /Dari 8 hingga 13: gambaran keseluruhan lengkap versi Java...

Dari 8 hingga 13: gambaran keseluruhan lengkap versi Java. Bahagian 2

Diterbitkan dalam kumpulan
Artikel ini ialah bahagian kedua ulasan saya tentang inovasi dalam Java versi 8-13. Bahagian pertama ada di sini . Tanpa berlengah lagi, mari kita teruskan: hingga 25 September 2018, apabila JDK baharu dikeluarkan:

Jawa 11

Dari 8 hingga 13: gambaran keseluruhan lengkap versi Java.  Bahagian 2 - 1

var (dalam lambda)

Mulai sekarang, kita boleh menentukan jenis parameter lambda atau meninggalkannya semasa menulis ungkapan lambda (ungkapan lambda yang ditaip secara tersirat):
Function<String, String> append = (var string) -> string + " Text";
String appendedString = append.apply("Some");
System.out.println(appendedString);
Anda juga boleh menambah anotasi pada parameter lambda tanpa perlu menulis nama jenis pembolehubah penuh:
Function<String, String> append = (@NonNull var string) -> string + " Text";

Z(ZGC)

ZGC ialah pengutip sampah baru yang tidak berfungsi. Ia memperuntukkan memori baharu tetapi tidak pernah memulakannya semula. ZGC berjanji untuk mengurus sejumlah besar memori dengan daya pemprosesan tinggi dan kependaman rendah (ZGC hanya tersedia pada platform 64-bit). Mewarna Rujukan - ZGC menggunakan penunjuk 64-bit dengan teknik yang dipanggil pewarna penunjuk. Penunjuk berwarna menyimpan maklumat tambahan tentang objek pada timbunan. Apabila memori menjadi berpecah-belah, ini membantu mengelakkan kemerosotan prestasi apabila GC perlu mencari ruang untuk peruntukan baharu. Pengumpulan sampah menggunakan ZGC terdiri daripada langkah-langkah berikut:
  1. dunia berhenti: kami mencari titik permulaan untuk mencapai objek pada timbunan (seperti pembolehubah tempatan atau medan statik);
  2. persilangan graf objek bermula daripada pautan akar. Kami menandakan setiap objek yang kami capai (ZGC berjalan melalui graf objek dan memeriksa penunjuk berwarna, menandakan objek yang tersedia);
  3. mengendalikan beberapa kes kelebihan, seperti pautan lemah;
  4. menggerakkan objek hidup, membebaskan kawasan besar timbunan untuk mempercepatkan peruntukan.
  5. apabila fasa bergerak bermula, ZGC membahagikan timbunan kepada halaman dan berfungsi satu halaman pada satu masa;
  6. ZGC menamatkan pergerakan mana-mana akar dan pergerakan selebihnya berlaku.
Topik ini sangat kompleks dan mengelirukan. Perbincangan terperinci memerlukan artikel yang berasingan, jadi saya tinggalkan sahaja di sini:

Epsilon GC

Epsilon ialah pengumpul sampah yang mengendalikan peruntukan memori tetapi tidak melaksanakan sebarang mekanisme pemulihan memori sebenar. Setelah timbunan Java yang tersedia habis, JVM akan ditutup. Iaitu, jika anda mula mencipta objek dalam tatasusunan tak terhingga tanpa mengikat rujukan dengan pengumpul sampah ini, aplikasi akan ranap dengan OutOfMemoryError (dan jika dengan yang lain, ia tidak akan, kerana ia akan membersihkan objek tanpa rujukan) . Mengapa ia diperlukan? Inilah sebabnya:
  1. Ujian prestasi.
  2. Ujian tekanan ingatan.
  3. Menguji antara muka VM.
  4. Kerja yang sangat singkat.
  5. Penambahbaikan kependaman penurunan terakhir.
  6. Penurunan terakhir peningkatan throughput.
Pautan berguna: Inovasi lain:
  1. ByteArrayOutputStreammendapat kaedah void writeBytes(byte [])yang menulis semua bait daripada hujah ke OutputStream.
  2. FileReaderdan FileWritermendapat pembina baharu yang membolehkan anda menentukan Charset.
  3. Pathmeraih dua kaedah baharu, of(String, String [])mengembalikan Pathdaripada hujah rentetan laluan atau urutan rentetan yang apabila digabungkan membentuk rentetan laluan dan of(URI): mengembalikan Laluan daripada URI.
  4. Pattern— menerima kaedah asMatchPredicate()yang menyemak sama ada rentetan input yang diberikan sepadan dengan corak yang diberikan (sama ada ia membenarkan anda mencipta predikat menggunakan ungkapan biasa supaya anda boleh, contohnya, menapis data dalam strim).
  5. StringSaya mengambil banyak kaedah berguna, seperti:
    • String strip(): akan mengembalikan kami rentetan yang merupakan rentetan ini, dengan semua ruang pada permulaan dan penghujung rentetan dikeluarkan (serupa dengan trim(), tetapi mentakrifkan ruang secara berbeza);
    • String stripLeading(): akan mengembalikan kami rentetan yang merupakan rentetan ini, mengalih keluar sebarang ruang utama daripada rentetan;
    • String stripTrailing(): akan mengembalikan kami rentetan yang merupakan rentetan ini, mengalih keluar sebarang ruang di hujung rentetan;
    • Stream lines(): akan mengembalikan kami Streamdaripada String, diekstrak daripada rentetan ini, dipisahkan oleh pemisah baris;
    • String repeat(int): akan mengembalikan kita rentetan yang merupakan gabungan rentetan ini, diulang beberapa kali.
    • boolean isBlank(): akan kembali benar jika rentetan kosong atau mengandungi hanya ruang, palsu sebaliknya.
  6. Thread— kaedah destroy() dan stop(Throwable) telah dialih keluar.
  7. Filesmendapat beberapa kaedah baru:
    • String readString(Path): membaca semua data daripada fail ke dalam rentetan, manakala penyahkodan daripada bait kepada aksara menggunakan pengekodan UTF-8;
    • String readString(Path, Charset): sama seperti dalam kaedah di atas, dengan perbezaan bahawa penyahkodan daripada bait kepada aksara berlaku menggunakan Charset yang ditentukan;
    • Path writeString (Path, CharSequence, OpenOption []): Menulis urutan aksara pada fail. Aksara dikodkan ke dalam bait menggunakan pengekodan UTF-8;
    • Path writeString(Path, CharSequence,Charset, OpenOption []): Kaedah yang sama seperti di atas, hanya aksara yang dikodkan ke dalam bait menggunakan pengekodan yang dinyatakan dalam Charset.
Ini adalah inovasi API yang paling menarik (menurut pendapat saya yang sederhana), berikut ialah beberapa bahan untuk semakan yang lebih terperinci:

Jawa 12

Enam bulan berlalu dan kita melihat peringkat seterusnya dalam evolusi Java. Jadi, sudah tiba masanya untuk mengeluarkan sekop ilmu dan menggali. Dari 8 hingga 13: gambaran keseluruhan lengkap versi Java.  Bahagian 2 - 2

Kemas kini G1

Penambahbaikan berikut telah dibuat untuk G1:
  1. Tuntut semula memori yang diperuntukkan yang tidak digunakan

    Dalam ingatan timbunan Java terdapat perkara seperti memori yang tidak digunakan (atau dengan kata lain, tidak aktif). Di Java 12 mereka memutuskan untuk menyelesaikan masalah ini, sekarang:

    • G1 mengembalikan ingatan daripada timbunan dalam GC penuh atau semasa gelung selari; G1 cuba menghalang GC penuh dan memulakan gelung selari berdasarkan peruntukan timbunan. Kita perlu memaksa G1 untuk mengembalikan ingatan dari timbunan.

    Peningkatan ini memfokuskan pada prestasi dengan mengembalikan memori secara automatik daripada timbunan ke OS apabila G1 tidak digunakan.

  2. Menggugurkan koleksi bercampur apabila masa jeda melebihi

    G1 menggunakan enjin analisis untuk memilih jumlah kerja yang diperlukan untuk kutipan sampah. Ia mengumpul objek hidup tanpa berhenti selepas menentukan set dan memulakan pembersihan. Ini menyebabkan pemungut sampah melebihi sasaran masa jedanya. Sebenarnya, masalah ini diselesaikan dengan penambahbaikan, kerana jika masa yang diperlukan untuk menyelesaikan langkah seterusnya melebihi had yang munasabah, langkah ini boleh diganggu.

Penanda aras mikro

Java 12 memperkenalkan ujian penanda aras mikro supaya prestasi JVM boleh diuji dengan mudah menggunakan penanda aras sedia ada. Ini akan sangat berguna untuk sesiapa sahaja yang ingin mengusahakan JVM itu sendiri. Ujian tambahan dibuat menggunakan Java Microbenchmark Harness (JMH). Ujian ini membolehkan ujian prestasi berterusan pada JVM. JEP 230 mencadangkan pengenalan kira-kira 100 ujian, dengan ujian baharu diperkenalkan apabila versi Java baharu dikeluarkan. Berikut ialah contoh ujian yang ditambah .

Shenandoah

Ini ialah algoritma kutipan sampah (GC) yang bertujuan untuk menjamin masa tindak balas yang rendah (had bawah ialah 10-500 ms). Ini mengurangkan masa jeda GC apabila melakukan kerja pembersihan serentak dengan menjalankan benang Java. Di Shenandoah, masa jeda adalah bebas daripada saiz timbunan. Ini bermakna masa jeda akan sama tanpa mengira saiz timbunan anda. Ini adalah ciri percubaan dan tidak termasuk dalam binaan standard (Oracle) OpenJDK.

Perbaiki Suis

Java 12 telah menambah baik ungkapan Suis untuk padanan corak. Sintaks baharu L → telah diperkenalkan. Berikut ialah senarai perkara utama suis baharu :
  1. Sintaks baharu menghapuskan keperluan untuk penyataan rehat untuk mengelakkan ralat.
  2. Tukar ungkapan tidak lagi gagal.
  3. Selain itu, kita boleh menentukan berbilang pemalar dalam satu label.
  4. kes lalai kini diperlukan dalam ungkapan suis.
  5. break digunakan dalam ungkapan Suis untuk mengembalikan nilai daripada daftar itu sendiri (sebenarnya, suis boleh mengembalikan nilai).
Mari kita lihat ini sebagai contoh:
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.";
  }
};
Panduan Definitif Untuk Menukar Ungkapan Dalam Java 13 Ciri baharu yang lain:
  1. String:

    transform(Function f)- Menggunakan fungsi yang disediakan pada rentetan. Hasilnya mungkin bukan rentetan.
    indent(int x)— menambah x ruang pada rentetan. Jika parameter negatif, maka bilangan ruang utama ini akan dialih keluar (jika boleh).

  2. Files- mengambil kaedah seperti mismatch(), yang, seterusnya, mencari dan mengembalikan kedudukan bait pertama yang tidak sepadan dalam kandungan dua fail, atau -1L jika tiada ketidakpadanan.

  3. Kelas baharu telah muncul -CompactNumberFormat untuk memformat nombor perpuluhan dalam bentuk padat. Contoh bentuk padat ini ialah 1M dan bukannya 1,000,000. Oleh itu, hanya dua dua diperlukan dan bukannya sembilan aksara.

  4. Terdapat juga yang baru enum , NumberFormatStyleyang mempunyai dua nilai - PANJANG dan PENDEK.

  5. InputStream mendapat kaedah skipNBytes(long n) : langkau bilangan bait ke-n dari aliran input.

Pautan Java 12 yang menarik:

Jawa 13

Dunia tidak diam, ia bergerak, ia berkembang, sama seperti Java - Java 13. Dari 8 hingga 13: gambaran keseluruhan lengkap versi Java.  Bahagian 2 - 3

Blok teks

Java sentiasa menderita sedikit apabila ia datang untuk menentukan rentetan. Jika kita perlu mentakrifkan baris dengan ruang, pemisah baris, petikan atau sesuatu yang lain, ini menyebabkan beberapa kesukaran, jadi kami terpaksa menggunakan aksara khas: contohnya, \n untuk pemisah baris atau melarikan diri daripada beberapa baris sendiri. Ini dengan ketara mengurangkan kebolehbacaan kod dan mengambil masa tambahan apabila menulis baris sedemikian. Ini menjadi ketara apabila menulis rentetan yang memaparkan JSON, XML, HTML, dll. Akibatnya, jika kita ingin menulis Json kecil, ia akan kelihatan seperti ini:
String JSON_STRING = "{\r\n" + "\"name\" : \"someName\",\r\n" + "\"site\" : \"https://www.someSite.com/\"\r\n" + "}";
Dan kemudian Java 13 datang ke tempat kejadian dan menawarkan kami penyelesaiannya dalam bentuk petikan berganda tiga sebelum dan selepas teks (yang mereka panggil blok teks). Mari lihat contoh json sebelumnya menggunakan inovasi ini:
String TEXT_BLOCK_JSON = """
{
    "name" : "someName",
    "site" : "https://www.someSite.com/"
}
""";
Lebih mudah dan lebih jelas, bukan? StringTiga kaedah baharu turut ditambah, masing-masing, untuk menguruskan blok ini:
  • stripIndent(): Mengalih keluar ruang rawak daripada rentetan. Ini berguna jika anda membaca rentetan berbilang baris dan ingin menggunakan jenis pengecualian ruang putih rawak yang sama yang berlaku dengan pengisytiharan eksplisit (pada asasnya mensimulasikan pengkompil untuk mengalih keluar ruang putih rawak);
  • formatted(Object... args ): serupa dengan format(String format, Object... arg), tetapi untuk blok teks;
  • translateEscapes(): Mengembalikan rentetan dengan urutan melarikan diri (seperti \r) diterjemahkan kepada nilai Unikod yang sepadan.

Perbaiki Suis

Ungkapan suis telah diperkenalkan dalam Java 12, dan 13 memperhalusinya. Dalam 12 anda mentakrifkan nilai pulangan menggunakan rehat. Dalam 13, nilai pulangan digantikan dengan hasil. Sekarang ungkapan suis yang kami ada di bahagian Java 12 boleh ditulis semula sebagai:
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.";
  }
};
Walaupun adalah perkara biasa bagi kami pengaturcara yang sudah biasa dengan Java untuk menerima rehat, namun ia agak pelik. Apa yang break true cuba beritahu saya? Kata kunci hasil baharu (agak baharu) lebih jelas dan mungkin muncul di tempat lain pada masa hadapan di mana nilai dikembalikan. Bagi mereka yang sangat berminat dengan topik ini, saya mengesyorkan agar anda membiasakan diri dengan bahan-bahan ini:

Arkib CDS Dinamik

CDS - Perkongsian Data Kelas. Membolehkan anda membungkus satu set kelas yang biasa digunakan ke dalam arkib yang kemudiannya boleh dimuatkan oleh berbilang kejadian JVM. Mengapa kita memerlukan ini? Hakikatnya ialah dalam proses memuatkan kelas, JVM melakukan banyak tindakan intensif sumber, seperti kelas membaca, menyimpannya dalam struktur dalaman, menyemak ketepatan kelas membaca, mencari dan memuatkan kelas bergantung, dsb. ., dan hanya selepas semua ini kelas sedia untuk berfungsi. Maklumlah, banyak sumber dibazirkan, kerana kejadian JVM selalunya boleh memuatkan kelas yang sama. Contohnya String, LinkedList, Integer. Nah, atau kelas aplikasi yang sama, dan semua ini adalah sumber. Jika kami melakukan semua langkah yang diperlukan sekali sahaja dan kemudian meletakkan kelas yang direka bentuk semula dalam arkib yang boleh dimuatkan ke dalam ingatan beberapa JVM, ini boleh menjimatkan ruang memori dengan ketara dan mengurangkan masa permulaan aplikasi. Sebenarnya, CDS membolehkan anda membuat arkib sedemikian. Java 9 hanya membenarkan kelas sistem untuk ditambahkan pada arkib. Java 10 - masukkan kelas aplikasi dalam arkib. Penciptaan arkib sedemikian terdiri daripada:
  • mencipta senarai kelas yang dimuatkan oleh aplikasi;
  • mencipta arkib yang sangat diperlukan dengan kelas yang kami temui.
Inovasi dalam Java 13 menambah baik CDS supaya ia boleh mencipta arkib apabila aplikasi ditamatkan. Ini bermakna kedua-dua langkah di atas kini akan digabungkan menjadi satu. Dan satu lagi perkara penting: hanya kelas yang dimuatkan semasa aplikasi berjalan akan ditambahkan pada arkib. Dalam erti kata lain, kelas tersebut yang masih terkandung dalam application.jar, tetapi atas sebab tertentu tidak dimuatkan, tidak akan ditambahkan pada arkib.

Kemas kini API Soket

API Soket ( java.net.Socket dan java.net.ServerSocket ) pada asasnya merupakan bahagian penting Java sejak penubuhannya, tetapi soket tidak pernah dikemas kini dalam dua puluh tahun yang lalu. Ditulis dalam C dan Java, mereka sangat, sangat besar dan sukar untuk dikekalkan. Tetapi Java 13 memutuskan untuk membuat pelarasan sendiri terhadap keseluruhan perkara ini dan menggantikan pelaksanaan asas. Kini, bukannya PlainSocketImpl, antara muka pembekal digantikan dengan NioSocketImpl . Pelaksanaan berkod baharu ini adalah berdasarkan infrastruktur bahagian belakang yang sama seperti java.nio . Pada asasnya kelas menggunakan cache penimbal java.util.concurrent dan mekanisme penguncian (yang berasaskan segmen) dan bukannya kaedah yang disegerakkan. Ia tidak lagi memerlukan kod asli, menjadikannya lebih mudah untuk dipindahkan ke platform yang berbeza. Namun, kami mempunyai cara untuk kembali menggunakan PlainSocketImpl , tetapi mulai sekarang NioSocketImpl digunakan secara lalai .

Pulangan Memori untuk ZGC

Seperti yang kita ingat, pemungut sampah Z telah diperkenalkan di Java 11 sebagai mekanisme pengumpulan sampah kependaman rendah supaya jeda GC tidak pernah melebihi 10 ms. Tetapi pada masa yang sama, tidak seperti HotSpot GC maya lain, seperti Shenandoah dan G1, ia boleh mengembalikan memori dinamik yang tidak digunakan kepada OS. Pengubahsuaian ini menambahkan keupayaan J ini kepada ZGC. Sehubungan itu, kami mendapat jejak memori yang dikurangkan bersama-sama dengan prestasi yang dipertingkatkan, dan ZGC kini mengembalikan memori yang tidak terikat kepada sistem pengendalian secara lalai sehingga saiz timbunan minimum yang ditentukan dicapai. Seperkara lagi: ZGC kini mempunyai saiz timbunan maksimum yang disokong sebanyak 16 TB. Sebelum ini, 4TB adalah hadnya. Inovasi lain:
  1. javax.security- menambah harta jdk.sasl.disabledMechanismsuntuk melumpuhkan mekanisme SASL.
  2. java.nio- kaedah telah ditambah FileSystems.newFileSystem (Path, Map <String,?>)- masing-masing, untuk mencipta fail baharu.
  3. Kelas java.niokini mempunyai kaedah mutlak (berbanding relatif) getdan set-kaedah. Mereka, seperti kelas abstrak asas Buffer, termasuk kaedah slice()untuk mendapatkan semula sebahagian daripada penimbal.
  4. Kaedah tambahan javax.xml.parsersuntuk membuat instantiating kilang DOM dan SAX (dengan sokongan ruang nama).
  5. Sokongan Unicode telah dikemas kini kepada versi 12.1.
Pautan menarik di Java 13:

Keputusan

Kita boleh meneliti inovasi yang diumumkan di Java 14, tetapi memandangkan ia akan melihat cahaya tidak lama lagi - JDK 14 dijadualkan untuk dikeluarkan pada 17 Mac 2020, adalah lebih baik untuk menjalankan semakan penuh yang berasingan serta-merta selepas dikeluarkan. . Saya juga ingin menarik perhatian anda kepada fakta bahawa dalam bahasa pengaturcaraan lain dengan rehat panjang antara keluaran, seperti Python 2–3, tidak ada keserasian: iaitu, jika kod itu ditulis dalam Python 2, anda akan perlu bekerja keras menterjemahkannya kepada 3. Java adalah istimewa dalam hal ini kerana ia sangat serasi ke belakang. Ini bermakna program Java 5 atau 8 anda dijamin untuk dijalankan pada mesin maya Java 8-13—dengan beberapa pengecualian yang anda tidak perlu risau buat masa ini. Adalah jelas bahawa ini tidak berfungsi sebaliknya: contohnya, jika aplikasi anda menggunakan fungsi Java 13 yang tidak tersedia dalam Java 8 JVM. Itu sahaja yang saya ada untuk hari ini, hormat kepada mereka yang telah membaca hingga ke tahap ini)) Dari 8 hingga 13: gambaran keseluruhan lengkap versi Java.  Bahagian 2 - 5
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION