Pengenalan kepada JVM Code Cache

1. Pengenalan

Dalam tutorial ini, kita akan melihat dan mengetahui tentang memori cache kod JVM dengan cepat.

2. Apakah Cache Kod itu?

Ringkasnya, JVM Code Cache adalah kawasan di mana JVM menyimpan bytecode yang disusun menjadi kod asli . Kami memanggil setiap blok kod asli yang boleh dilaksanakan sebagai kaedah . Kaedah nmungkin kaedah Java yang lengkap atau sebaris.

Penyusun just-in-time (JIT) adalah pengguna terbesar kawasan cache kod. Itulah sebabnya sebilangan pemaju memanggil memori ini sebagai cache kod JIT.

3. Penalaan Cache Kod

Cache kod mempunyai ukuran tetap . Setelah penuh, JVM tidak akan menyusun kod tambahan kerana penyusun JIT kini dimatikan. Selanjutnya, kami akan menerima pesanan amaran "CodeCache penuh ... Pengompil telah dilumpuhkan ". Hasilnya, kami akan mengalami penurunan prestasi dalam aplikasi kami. Untuk mengelakkan ini, kita dapat menyesuaikan cache kod dengan pilihan ukuran berikut:

  • InitialCodeCacheSize - saiz cache kod awal, lalai 160K
  • ReservedCodeCacheSize - ukuran maksimum lalai ialah 48MB
  • CodeCacheExpansionSize - ukuran pengembangan cache kod, 32KB atau 64KB

Meningkatkan ReservedCodeCacheSize boleh menjadi penyelesaian, tetapi ini biasanya hanya penyelesaian sementara.

Nasib baik, JVM menawarkan pilihan UseCodeCacheFlushing untuk mengawal pemindahan kawasan cache kod . Nilai lalai adalah salah. Apabila kita mengaktifkannya, ia akan membebaskan kawasan yang dihuni apabila syarat berikut dipenuhi:

  • cache kod penuh; kawasan ini memerah jika ukurannya melebihi ambang tertentu
  • selang masa tertentu dilalui sejak pembersihan terakhir
  • kod yang dikompilasi tidak cukup panas. Untuk setiap kaedah yang disusun, JVM mengesan kaunter panas khas. Sekiranya nilai kaunter ini kurang daripada ambang yang dikira, JVM membebaskan sekeping kod yang dikompilasi ini

4. Penggunaan Cache Kod

Untuk memantau penggunaan cache kod, kita perlu mengesan ukuran memori yang sedang digunakan.

Untuk mendapatkan maklumat mengenai penggunaan cache kod, kita dapat menentukan pilihan –XX: + PrintCodeCache JVM . Setelah menjalankan aplikasi kami, kami akan melihat output yang serupa:

CodeCache: size=32768Kb used=542Kb max_used=542Kb free=32226Kb 

Mari kita lihat apa maksud setiap nilai ini:

  • ukuran dalam output menunjukkan ukuran maksimum memori, yang serupa dengan ReservedCodeCacheSize
  • yang digunakan adalah ukuran sebenar memori yang sedang digunakan
  • max_used adalah ukuran maksimum yang telah digunakan
  • percuma adalah memori yang tinggal yang belum ditempati

Pilihan PrintCodeCache sangat berguna, kerana kita dapat:

  • lihat bila pembilasan berlaku
  • tentukan sama ada kita mencapai titik penggunaan memori kritikal

5. Cache Kod Segmen

Pada Java 9, JVM membahagikan cache kod menjadi tiga segmen berbeza yang masing-masing mengandungi jenis kod tersusun tertentu . Untuk lebih spesifik, terdapat tiga segmen:

  • Segmen bukan kaedah mengandungi kod berkaitan dalaman JVM seperti jurubahasa bytecode. Secara lalai, segmen ini sekitar 5 MB. Juga, mungkin untuk mengkonfigurasi ukuran segmen melalui bendera penalaan -XX: NonNMethodCodeHeapSize
  • Segmen kod berprofil mengandungi kod yang dioptimumkan dengan jangka hayat yang berpotensi pendek. Walaupun ukuran segmen sekitar 122 MB secara lalai, kami dapat mengubahnya melalui bendera penalaan -XX: ProfiledCodeHeapSize
  • Segmen yang tidak diprofilkan mengandungi kod yang dioptimumkan sepenuhnya dengan jangka hayat yang berpotensi panjang. Begitu juga, ia adalah sekitar 122 MB secara lalai. Nilai ini, tentu saja, dapat dikonfigurasi melalui bendera penalaan -XX: NonProfiledCodeHeapSize

Struktur baru ini memperlakukan pelbagai jenis kod yang dipatuhi secara berbeza, yang membawa kepada prestasi keseluruhan yang lebih baik.

Sebagai contoh, memisahkan kod yang disusun jangka pendek dari kod jangka panjang meningkatkan prestasi penyapu kaedah - terutamanya kerana perlu mengimbas kawasan memori yang lebih kecil.

6. Kesimpulannya

Artikel ringkas ini memberikan pengenalan ringkas kepada JVM Code Cache.

Selain itu, kami memaparkan beberapa pilihan penggunaan dan penyesuaian untuk memantau dan mendiagnosis kawasan memori ini.