C1 and C2 are the real names of HotSpot's two JIT compilers, and the exact invocation thresholds you're documenting (~1500 for C1, ~10000 for C2) are why benchmarking tools like JMH insist on warmup iterations before measuring — without them you're timing the interpreter, not the optimized code. On-Stack Replacement is the same mechanism that lets a long-running loop get optimized mid-execution instead of waiting for the method to be called again.