Pengantar Cache Kode JVM

1. Perkenalan

Dalam tutorial ini, kita akan melihat sekilas dan mempelajari tentang memori cache kode JVM.

2. Apa Itu Cache Kode?

Sederhananya, JVM Code Cache adalah area tempat JVM menyimpan bytecode yang dikompilasi ke dalam kode native . Kami menyebut setiap blok kode native yang dapat dieksekusi sebagai nmethod . Metode n mungkin merupakan metode Java lengkap atau sebaris.

Kompiler just-in-time (JIT) adalah konsumen terbesar dari area cache kode. Itulah mengapa beberapa pengembang menyebut memori ini sebagai cache kode JIT.

3. Penyetelan Cache Kode

Cache kode memiliki ukuran tetap . Setelah penuh, JVM tidak akan mengkompilasi kode tambahan karena kompilator JIT sekarang tidak aktif. Selanjutnya, kita akan menerima pesan peringatan “CodeCache is full… Compiler has been disabled ”. Akibatnya, kami akan mengalami penurunan kinerja dalam aplikasi kami. Untuk menghindarinya, kita dapat menyetel cache kode dengan opsi ukuran berikut:

  • InitialCodeCacheSize - ukuran cache kode awal, standar 160K
  • ReservedCodeCacheSize - ukuran maksimum default adalah 48MB
  • CodeCacheExpansionSize - ukuran perluasan cache kode, 32KB atau 64KB

Meningkatkan ReservedCodeCacheSize bisa menjadi solusi, tetapi ini biasanya hanya solusi sementara.

Untungnya, JVM menawarkan opsi UseCodeCacheFlushing untuk mengontrol pembilasan area cache kode . Nilai defaultnya salah. Saat kami mengaktifkannya, ini membebaskan area yang diduduki saat kondisi berikut terpenuhi:

  • cache kode sudah penuh; daerah ini dibilas jika ukurannya melebihi ambang batas tertentu
  • interval tertentu dilewati sejak pembersihan terakhir
  • kode yang telah dikompilasi tidak cukup panas. Untuk setiap metode yang dikompilasi, JVM melacak penghitung hotness khusus. Jika nilai penghitung ini kurang dari ambang batas yang dihitung, JVM membebaskan potongan kode yang telah dikompilasi ini

4. Penggunaan Cache Kode

Untuk memantau penggunaan cache kode, kita perlu melacak ukuran memori yang sedang digunakan.

Untuk mendapatkan informasi tentang penggunaan cache kode, kita dapat menentukan opsi –XX: + PrintCodeCache JVM . Setelah menjalankan aplikasi kita, kita akan melihat hasil yang serupa:

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

Mari kita lihat apa arti masing-masing nilai ini:

  • size pada keluaran menunjukkan ukuran maksimum memori, yang identik dengan ReservedCodeCacheSize
  • digunakan adalah ukuran sebenarnya dari memori yang sedang digunakan
  • max_used adalah ukuran maksimum yang telah digunakan
  • free adalah sisa memori yang belum ditempati

The PrintCodeCache pilihan adalah sangat berguna, seperti yang kita dapat:

  • lihat kapan pembilasan terjadi
  • menentukan apakah kita mencapai titik penggunaan memori kritis

5. Cache Kode Tersegmentasi

Pada Java 9, JVM membagi cache kode menjadi tiga segmen berbeda yang masing-masing berisi jenis kode terkompilasi tertentu . Untuk lebih spesifiknya, ada tiga segmen:

  • Segmen non-metode berisi kode terkait internal JVM seperti interpreter bytecode. Secara default, segmen ini berukuran sekitar 5 MB. Selain itu, dimungkinkan untuk mengonfigurasi ukuran segmen melalui flag tuning -XX: NonNMethodCodeHeapSize
  • Segmen kode yang diprofilkan berisi kode yang sedikit dioptimalkan dengan masa pakai yang berpotensi singkat. Meskipun ukuran segmen secara default sekitar 122 MB, kita dapat mengubahnya melalui flag tuning -XX: ProfiledCodeHeapSize
  • Segmen non-profil berisi kode yang dioptimalkan sepenuhnya dengan potensi masa pakai yang lama. Demikian pula, sekitar 122 MB secara default. Nilai ini, tentu saja, dapat dikonfigurasi melalui flag tuning -XX: NonProfiledCodeHeapSize

Struktur baru ini memperlakukan berbagai jenis kode yang dipatuhi secara berbeda, yang mengarah pada kinerja keseluruhan yang lebih baik.

Misalnya, memisahkan kode yang dikompilasi berumur pendek dari kode berumur panjang meningkatkan kinerja penyapu metode - terutama karena perlu memindai wilayah memori yang lebih kecil.

6. Kesimpulan

Artikel singkat ini menyajikan pengenalan singkat tentang Cache Kode JVM.

Selain itu, kami menyajikan beberapa opsi penggunaan dan tune-up untuk memantau dan mendiagnosis area memori ini.