Apa itu ReservedCodeCacheSize dan InitialCodeCacheSize?

89

Dapatkah seseorang tolong jelaskan apa pilihan JVM ReservedCodeCacheSizedan InitialCodeCacheSizeyang? Khususnya kapan / mengapa saya ingin mengubahnya? Bagaimana cara memutuskan ukuran yang tepat?

Inilah yang dikatakan dokumen:

-XX: ReservedCodeCacheSize = 32m Ukuran cache kode yang dicadangkan (dalam byte) - ukuran cache kode maksimum. [Solaris 64-bit, amd64, dan -server x86: 2048m; di 1.5.0_06 dan sebelumnya, Solaris 64-bit dan and64: 1024m.]

Raghu
sumber
2
OP dari posting ini menulis:> -XX: ReservedCodeCacheSize = 32m Ukuran cache kode yang dicadangkan (dalam byte) - ukuran cache kode maksimum. [Solaris 64-bit, amd64, dan -server x86: 48m; di 1.5.0_06 dan sebelumnya, Solaris 64-bit dan and64: 1024m.] Saya hanya ingin mengoreksi bahwa batas atas yang disebutkan di 48m pasti salah ketik. Ini 2048m.
Lasse Aagren

Jawaban:

74

ReservedCodeCacheSize(dan InitialCodeCacheSize) adalah opsi untuk compiler (just-in-time) dari Java Hotspot VM. Pada dasarnya ini menetapkan ukuran maksimum untuk cache kode kompiler.

Cache bisa menjadi penuh, yang menghasilkan peringatan seperti berikut:

Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled.
Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize=
Code Cache  [0x000000010958f000, 0x000000010c52f000, 0x000000010c58f000)
 total_blobs=15406 nmethods=14989 adapters=362 free_code_cache=835Kb largest_free_block=449792

Jauh lebih buruk jika diikuti oleh Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated.

Kapan menyetel opsi ini?

  1. ketika mengalami kegagalan kompiler Hotspot
  2. untuk mengurangi memori yang dibutuhkan oleh JVM (dan karenanya berisiko mengalami kegagalan compiler JIT)

Biasanya Anda tidak akan mengubah nilai ini. Saya pikir nilai default cukup seimbang karena masalah ini hanya terjadi pada kesempatan yang sangat jarang (dalam pengalaman saya).

jeha
sumber
1
Bagus. Apa saja nilai defaultnya, dan apa yang harus dinaikkan jika kita melihat "CodeCache sudah penuh". peringatan?
axel22
3
@ axel22: Nilai sebenarnya bergantung pada platform dan versi JVM; nilai dari doc untuk Sun JVM: Reserved code cache size (in bytes) - maximum code cache size. [Solaris 64-bit, amd64, and -server x86: 48m; in 1.5.0_06 and earlier, Solaris 64-bit and amd64: 1024m.]Tidak tahu nilai OpenJDK. Peningkatan moderat sudah cukup (pengaturan awal 1024m melampaui kebaikan dan kejahatan).
jeha
12

@jeha menjawab semua yang ingin saya ketahui dari pertanyaan ini, selain dari nilai apa yang harus ditetapkan parameternya. Karena saya tidak menulis kode yang saya terapkan, saya tidak memiliki banyak visibilitas ke jejak memori yang dimilikinya.

Namun, Anda dapat menggunakan jconsole untuk melampirkan ke proses java Anda yang sedang berjalan, dan kemudian gunakan tab 'Memori' untuk mengetahui ukuran Cache Kode. Untuk kelengkapan, langkah-langkahnya adalah (lingkungan VM Linux, meskipun saya yakin lingkungan lain serupa):

  1. Jalankan jconsole di komputer Anda
  2. Temukan ID proses yang tepat dan lampirkan jconsole padanya (ini akan memakan waktu beberapa saat)
  3. Arahkan ke tab 'Memori'
  4. Dari daftar drop-down 'Chart:', pilih 'Memory Pool "Code Cache"'
  5. Sekali lagi, ini mungkin membutuhkan beberapa saat untuk menyegarkan layar, dan kemudian Anda akan melihat sesuatu seperti: gambar cache kode jconsole

    Seperti yang Anda lihat, cache kode saya menggunakan kira-kira 49 MB. Pada titik ini saya masih memiliki default yang menurut dokumentasi (dan @jeha) adalah 48 MB. Pastinya menjadi motivasi besar bagi saya untuk meningkatkan setting!

    Ben.


    1024 MB secara default mungkin berlebihan, tetapi 48 MB secara default tampaknya kurang dari itu ...

Hewan 451
sumber
Saran yang bagus .... Saya mencoba dengan -J-XX: ReservedCodeCacheSize = 512m
MarcoZen
Netbeans tidak akan mulai dengan 512m, lakukan dengan 256m
MarcoZen
Dan setelah pengujian selama kira-kira 2 hari saya dapat mengatakan bahwa pengaturan tidak menunjukkan peningkatan yang nyata dan malah membuat netbeans mabuk. Saya akhirnya hanya menghapusnya.
MarcoZen
3

Pengalaman belajar yang baik dari tim engineering Indeed dan tantangan yang mereka hadapi saat bermigrasi ke jdk 8.

http://engineering.indeedblog.com/blog/2016/09/job-search-web-app-java-8-migration/

Kesimpulan: Jdk 8 membutuhkan lebih banyak cache kode daripada JDK 7

Ukuran codecache default untuk JRE 8 adalah sekitar 250MB, sekitar lima kali lebih besar dari 48MB default untuk JRE 7. Pengalaman kami adalah bahwa JRE 8 membutuhkan codecache ekstra itu. Kami telah mengalihkan sekitar sepuluh layanan ke JRE 8 sejauh ini, dan semuanya menggunakan codecache sekitar empat kali lebih banyak daripada sebelumnya.

vsingh
sumber
0

dari https://blogs.oracle.com/poonam/entry/why_do_i_get_message :

Berikut adalah dua masalah yang diketahui di jdk7u4 + sehubungan dengan pembilasan CodeCache:

  1. Kompilator mungkin tidak dimulai ulang bahkan setelah hunian CodeCache turun menjadi hampir setengah setelah pembilasan darurat.
  2. Pembilasan darurat dapat menyebabkan penggunaan CPU yang tinggi oleh utas kompilator yang menyebabkan penurunan kinerja secara keseluruhan.

Masalah kinerja ini, dan masalah kompiler tidak dapat diaktifkan kembali telah diatasi di JDK8. Untuk mengatasinya di JDK7u4 +, kita dapat meningkatkan ukuran cache kode menggunakan opsi ReservedCodeCacheSize dengan menyetelnya ke nilai yang lebih besar dari footprint kode yang dikompilasi sehingga CodeCache tidak pernah penuh. Solusi lain untuk ini adalah menonaktifkan CodeCache Flushing menggunakan opsi -XX: -UseCodeCacheFlushing JVM.

Masalah yang disebutkan di atas telah diperbaiki di JDK8 dan pembaruannya.

Sehingga informasi tersebut mungkin layak untuk disebutkan untuk sistem yang berjalan pada JDK 6 (menonaktifkan pembilasan kode) dan 7.

Andre Steingress
sumber