Search code examples
javajvmjit

What exactly does -XX:-TieredCompilation do?


Using java -XX:+PrintFlagsFinal I found the TieredCompilation flag, and I read about it a bit online.

Yet, I still don't know exactly what happens when setting it to false.

I know that the compilation system supports 5 execution levels, basically splitted into interpreter, C1 and C2:

  • level 0 - interpreter
  • level 1 - C1 with full optimization (no profiling)
  • level 2 - C1 with invocation and backedge counters
  • level 3 - C1 with full profiling (level 2 + MDO)
  • level 4 - C2

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

Two questions:

(1) By setting -XX:-TieredCompilation, are some of this levels just disabled? If yes, which?

(2) Is there some flag to decide whether to disable C1 or C2, or to not compile at all?


Solution

  • -XX:-TieredCompilation disables intermediate compilation tiers (1, 2, 3), so that a method is either interpreted or compiled at the maximum optimization level (C2).

    As a side effect TieredCompilation flag also changes the number of compiler threads, the compilation policy and the default code cache size. Note that with TieredCompilation disabled

    • there will be less compiler threads;
    • simple compilation policy (based on method invocation and backedge counters) will be chosen instead of advanced compilation policy;
    • default reserved code cache size will be 5 times smaller.

    To disable C2 compiler and to leave only C1 with no extra overhead, set -XX:TieredStopAtLevel=1.

    To disable all JIT compilers and to run everything in interpreter, use -Xint.