JVM早期-client模式默认CompileThreshold=1500,server模式为10000,反映不同优化取舍;JDK 8起移除-client,JDK 9后-server默认启用,统一为分层编译,CompileThreshold仅影响C1触发时机。

Java虚拟机的-client与-server模式在JVM早期版本(如JDK 6及之前)中存在明确区分,其中CompileThreshold是控制方法被JIT编译前需被解释执行次数的关键参数。但需注意:自JDK 8起,-client选项已被移除;JDK 9及以后,-server也默认启用且不再作为独立选项——现代HotSpot JVM已统一为“分层编译”模型,CompileThreshold行为随之重构。
默认阈值差异(JDK 7及更早)
在仍支持双模式的旧版JVM中:
-
-client模式下,默认CompileThreshold=1500,即一个方法被调用1500次后触发C1编译(快速、轻量级的即时编译) -
-server模式下,默认CompileThreshold=10000,更高阈值意味着更激进的解释执行阶段,以换取更充分的热点识别和更优的C2编译质量
实际影响不止于数值大小
阈值差异背后是整套优化策略的取舍:
- 低阈值(如-client)倾向快速编译,适合启动快、生命周期短的应用,但生成代码优化程度有限
- 高阈值(如-server)延长解释执行时间,允许JVM收集更多运行时信息(如分支概率、对象分配模式),支撑更深度的内联、逃逸分析等高级优化
- 两者还配套不同默认的
OnStackReplacePercentage和FrequencyThread等参数,共同影响栈上替换(OSR)和后台编译调度
现代JVM中的变化
在JDK 8+中,虽然-XX:CompileThreshold仍可设置,但其作用已受限:
- 分层编译(Tiered Compilation)默认开启,方法先经C1编译(含profiling),再根据热度升级至C2;此时
CompileThreshold仅影响第一层(C1)的触发时机 - C2编译决策更多依赖
tierXMinInvocationThreshold、tierXMinBackedgeThreshold等分层阈值,而非单一全局值 - 可通过
-XX:+PrintCompilation观察各层级编译日志,验证实际触发条件
若需精细控制编译行为,建议优先使用-XX:+TieredStopAtLevel=1(强制只用C1)或-XX:TieredStopAtLevel=4(启用完整分层),而非依赖过时的-client/-server开关。










