Meneroka Bendera Penalaan JVM

1. Gambaran keseluruhan

Ada kemungkinan untuk menyesuaikan HotSpot JVM dengan pelbagai penalaan bendera. Oleh kerana terdapat ratusan bendera seperti itu, mengawasi dan nilai lalai mereka sedikit menakutkan.

Dalam tutorial ini, kami akan memperkenalkan beberapa cara untuk menemui bendera penyesuaian tersebut dan belajar bagaimana bekerja dengannya.

2. Tinjauan Pilihan Java

The java arahan menyokong pelbagai bendera jatuh ke dalam kategori berikut:

  • Pilihan standard yang dijamin akan disokong oleh semua pelaksanaan JVM di luar sana. Biasanya, pilihan ini digunakan untuk tindakan seharian seperti –classpath, -cp, –version, dan sebagainya
  • Pilihan tambahan yang tidak disokong oleh semua pelaksanaan JVM dan biasanya boleh berubah. Pilihan ini bermula dengan -X

Harap diperhatikan bahawa kita tidak boleh menggunakan pilihan tambahan ini secara santai. Lebih-lebih lagi, beberapa pilihan tambahan itu lebih maju dan bermula dengan -XX .

Sepanjang artikel ini, kami akan memfokuskan pada bendera -XX yang lebih maju .

3. Bendera Penalaan JVM

Untuk menyenaraikan bendera penalaan JVM global, kita dapat mengaktifkan bendera PrintFlagsFinal seperti berikut:

>> java -XX:+PrintFlagsFinal -version [Global flags] uintx CodeCacheExpansionSize = 65536 {pd product} {default} bool CompactStrings = true {pd product} {default} bool DoEscapeAnalysis = true {C2 product} {default} double G1ConcMarkStepDurationMillis = 10.000000 {product} {default} size_t G1HeapRegionSize = 1048576 {product} {ergonomic} uintx MaxHeapFreeRatio = 70 {manageable} {default} // truncated openjdk version "14" 2020-03-17 OpenJDK Runtime Environment (build 14+36-1461) OpenJDK 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)

Seperti yang ditunjukkan di atas, beberapa bendera mempunyai nilai lalai untuk versi JVM ini.

Nilai lalai untuk beberapa bendera mungkin berbeza pada platform yang berbeza, yang ditunjukkan di lajur terakhir. Contohnya, produk bermaksud bahawa tetapan lalai bendera adalah seragam di semua platform; yang produk pd cara bahawa tetapan lalai bendera adalah platform yang bergantung kepada. Yang terkawal nilai boleh diubah secara dinamik pada masa jalanan.

3.1. Bendera Diagnostik

The PrintFlagsFinal bendera, bagaimanapun, tidak menunjukkan semua bendera tuning mungkin. Sebagai contoh, untuk melihat bendera penalaan diagnostik, kita harus menambahkan bendera UnlockDiagnosticVMOptions :

>> java -XX:+PrintFlagsFinal -version | wc -l 557 >> java -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version | wc -l 728

Jelas, terdapat beberapa ratus lagi bendera ketika kami menyertakan pilihan diagnostik. Contohnya, mencetak statistik penjejakan memori asli hanya tersedia sebagai sebahagian daripada bendera diagnostik:

bool PrintNMTStatistics = false {diagnostic} {default}

3.2. Bendera Eksperimental

Untuk melihat pilihan percubaan, kita harus menambahkan bendera UnlockExperimentalVMOptions :

>> java -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version | wc -l 809

3.3. Bendera JVMCI

Seperti Java 9, antara muka pengkompil JVM atau JVMCI memungkinkan kita menggunakan penyusun yang ditulis dalam Java, seperti Graal, sebagai penyusun dinamik.

Untuk melihat pilihan yang berkaitan dengan JVMCI, kita harus menambah beberapa bendera dan juga mengaktifkan JVMCI:

>> java -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions \ >> -XX:+JVMCIPrintProperties -XX:+EnableJVMCI -XX:+PrintFlagsFinal -version | wc -l 1516

Akan tetapi, kebanyakan waktu, menggunakan pilihan global, diagnostik, dan eksperimen semestinya mencukupi dan akan membantu kita mencari bendera yang kita ingat.

3.4. Menggabungkan Semuanya

Kombinasi pilihan ini dapat membantu kita mencari bendera penalaan, terutama ketika kita tidak ingat nama sebenarnya. Sebagai contoh, untuk mencari bendera penyesuaian yang berkaitan dengan rujukan lembut di Java:

>> alias jflags="java -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version" >> jflags | grep Soft size_t SoftMaxHeapSize = 4294967296 {manageable} {ergonomic} intx SoftRefLRUPolicyMSPerMB = 1000 {product} {default}

Dari hasilnya, kita dapat dengan mudah meneka bahawa SoftRefLRUPolicyMSPerMB adalah bendera yang kita cari.

4. Berbagai Jenis Bendera

Pada bahagian sebelumnya, kami membincangkan topik penting: jenis bendera. Mari kita lihat java -XX: + PrintFlagsFinal- output keluaran:

[Global flags] uintx CodeCacheExpansionSize = 65536 {pd product} {default} bool CompactStrings = true {pd product} {default} bool DoEscapeAnalysis = true {C2 product} {default} double G1ConcMarkStepDurationMillis = 10.000000 {product} {default} size_t G1HeapRegionSize = 1048576 {product} {ergonomic} uintx MaxHeapFreeRatio = 70 {manageable} {default} // truncated

Seperti yang ditunjukkan di atas, setiap bendera mempunyai jenis tertentu.

Pilihan boolean digunakan untuk mengaktifkan atau mematikan ciri . Pilihan seperti itu tidak memerlukan nilai. Untuk mengaktifkannya, kita hanya perlu meletakkan tanda tambah sebelum nama pilihan:

-XX:+PrintFlagsFinal

Sebaliknya, untuk melumpuhkannya, kita harus menambahkan tanda tolak sebelum namanya:

-XX:-RestrictContended

Jenis bendera lain memerlukan nilai argumen. Ada kemungkinan untuk memisahkan nilai dari nama pilihan dengan spasi, titik dua, tanda sama, atau argumen boleh langsung mengikuti nama pilihan (sintaks yang tepat berbeza untuk setiap pilihan):

-XX:ObjectAlignmentInBytes=16 -Xms5g -Xlog:gc

5. Dokumentasi dan Kod Sumber

Mencari nama bendera yang betul adalah satu perkara. Menjumpai apa yang dilakukan oleh bendera itu adalah kisah lain.

Salah satu cara untuk mengetahui perincian seperti ini adalah dengan melihat dokumentasi. Sebagai contoh, dokumentasi untuk perintah java di bahagian spesifikasi alat JDK adalah tempat yang baik untuk memulakan.

Kadang kala, tidak ada jumlah dokumentasi yang dapat mengalahkan kod sumber. Oleh itu, jika kita mempunyai nama bendera tertentu, maka kita dapat meneroka kod sumber JVM untuk mengetahui apa yang berlaku.

Sebagai contoh, kita dapat melihat kod sumber HotSpot JVM dari GitHub atau bahkan repositori Mercurial mereka dan kemudian:

>> git clone [email protected]:openjdk/jdk14u.git openjdk >> cd openjdk/src/hotspot >> grep -FR 'PrintFlagsFinal' . ./share/runtime/globals.hpp: product(bool, PrintFlagsFinal, false, ./share/runtime/init.cpp: if (PrintFlagsFinal || PrintFlagsRanges) {

Di sini kami mencari semua fail yang mengandungi rentetan PrintFlagsFinal . Setelah mencari fail yang bertanggungjawab, kita dapat melihat-lihat dan melihat bagaimana bendera tersebut berfungsi.

6. Kesimpulannya

Dalam artikel ini, kami melihat bagaimana kami dapat menemui hampir semua bendera penalaan JVM yang tersedia dan juga mempelajari beberapa trik untuk bekerja dengan mereka dengan lebih berkesan.