Pertanyaan Apa sebenarnya yang dilakukan -XX: -TieredCompilation?


Menggunakan java -XX:+PrintFlagsFinal Saya menemukan itu TieredCompilation bendera, dan saya membacanya sedikit online.

Namun, saya masih belum tahu persis apa yang terjadi saat mengaturnya false.

Saya tahu bahwa sistem kompilasi mendukung 5 level eksekusi, pada dasarnya dibagi menjadi interpreter, C1 dan C2:

  • level 0 - interpreter
  • level 1 - C1 dengan optimalisasi penuh (tanpa profil)
  • level 2 - C1 dengan penghitungan dan counter backedge
  • level 3 - C1 dengan profil lengkap (level 2 + MDO)
  • level 4 - C2

Sumber: http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/2b2511bd3cc8/src/share/vm/runtime/advancedThresholdPolicy.hpp#l34

Dua pertanyaan:

(1) Dengan pengaturan -XX:-TieredCompilation, apakah beberapa level ini hanya dinonaktifkan? Jika ya, yang mana?

(2) Apakah ada bendera untuk memutuskan apakah akan menonaktifkan C1 atau C2, atau tidak melakukan kompilasi sama sekali?


32
2017-08-02 13:03


asal


Jawaban:


-XX:-TieredCompilation menonaktifkan tingkatan kompilasi menengah (1, 2, 3), sehingga metode tersebut ditafsirkan atau dikompilasi pada tingkat optimalisasi maksimum (C2).

Sebagai efek samping TieredCompilation flag juga mengubah jumlah thread compiler, kebijakan kompilasi dan ukuran cache kode default. Perhatikan bahwa dengan TieredCompilation cacat

  • akan ada lebih sedikit thread kompilator;
  • kebijakan kompilasi sederhana (berdasarkan metode pemanggilan dan counter backedge) akan dipilih sebagai gantinya kebijakan kompilasi lanjutan;
  • ukuran cache kode default yang disediakan akan 5 kali lebih kecil.

Untuk menonaktifkan kompiler C2 dan hanya meninggalkan C1 tanpa tambahan biaya tambahan, atur -XX:TieredStopAtLevel=1.

Untuk menonaktifkan semua kompiler JIT dan menjalankan semuanya dalam interpreter, gunakan -Xint.


33
2017-08-02 13:34



Ada berbagai level JIT, seperti yang Anda perhatikan (termasuk tidak menjalankan JIT sama sekali).

Di versi Java yang lebih lama, Anda harus memilihnya terlebih dahulu (mis. -Xint, -client, -server) untuk dijalankan hanya dengan interpreter, hanya dengan compiler client (C1), atau hanya kompilator server (C2).

Kompilasi bertingkat, yang datang dengan Java 7, berarti kompiler hotspot bisa beralih di antara langkah-langkah tersebut dengan mulus. Jadi apa yang terjadi adalah bahwa setelah sejumlah tertentu berjalan, kode akan dikompilasi dengan C1, dan kemudian setelah lebih banyak berjalan, itu akan dikompilasi dengan C2. Ini adalah metode-dengan-metode dasar, jadi ketika suatu aplikasi berjalan sebagian besar hanya akan berjalan di bawah juru (yang untuk kode dingin) dan kemudian setelah kode dijalankan banyak (panas) maka akan dikompilasi ke lebih berprestasi. Anda dapat melihat level yang berbeda dengan berlari

$ java -XX:+PrintFlagsFinal -version | grep CompileThreshold
intx Tier2CompileThreshold                     = 0
intx Tier3CompileThreshold                     = 2000
intx Tier4CompileThreshold                     = 15000
openjdk version "1.8.0_92"
OpenJDK Runtime Environment (Zulu 8.15.0.1-macosx) (build 1.8.0_92-b15)
OpenJDK 64-Bit Server VM (Zulu 8.15.0.1-macosx) (build 25.92-b15, mixed mode)

Itu -XX:-TieredCompilation pada dasarnya TieredCompilation=false yang berarti tidak melakukan transisi ini, dan Anda harus memilih di depan apakah akan menggunakan klien atau kompiler server. JVM secara heuristik memutuskan mode mana yang akan diterapkan berdasarkan pada CPU Anda; jika Anda memiliki beberapa prosesor atau 64-bit VM maka ia akan menggunakan Server VM (C2), jika tidak maka akan menggunakan Client VM (C1).

Begitu -Xint akan berjalan hanya dengan interpreter (yaitu tanpa kompiler) dan Anda dapat memilih hanya C1 atau C2 saja -clientatau -server masing-masing, bersama dengan -XX:-TieredCompilation


11
2017-08-02 13:13



Sebagai pengguna Java 8, disarankan untuk menonaktifkan TieredComplilation untuk penggunaan produksi dengan floating point.

Oracle tidak akan memperbaiki masalah ini di Java8. Semua hotspot JVM 8 w / G1GC memiliki masalah yang sama.

(Bug1) (Bug2)


2
2018-06-13 02:15