目前的 Java 虚拟机支持 Client 和 Server 两种运行模式
需要特别说明的是,这两种运行模式是 HotSpot 虚拟机特有的设计,其他 JVM 实现并不一定提供该模式区分。在 JDK 1.7 及之前的版本中,可通过启动参数手动指定运行模式:
指定 Client 模式:java -client YourClass
指定 Server 模式:java -server YourClass
Client 模式(客户端模式)
该模式面向短生命周期、交互性强的桌面应用(如本地小工具、轻量级 GUI 程序、快速测试脚本),核心目标是最小化启动时间与内存占用。
它采用轻量级的 JIT 编译器 ------C1 编译器,仅执行基础且低耗时的编译优化,无需收集程序运行时的性能数据。
典型的基础优化包括:
方法内联:将短小方法的代码直接嵌入调用方,减少方法调用的栈帧切换开销;
常量传播:将常量值直接代入计算逻辑,避免运行时重复读取常量的冗余操作。
这类优化可以在程序启动初期快速完成,保障桌面应用的即时响应特性。
Server 模式(服务端模式)
该模式面向长生命周期、高吞吐量的服务端应用(如 Web 服务器、微服务节点、大数据计算引擎),核心目标是最大化长期运行效率。
它采用重量级的 JIT 编译器 ------C2 编译器,基于基于轮廓的优化机制实现深度优化。程序启动初期会先以解释模式运行,同时收集热点方法(高频执行的方法)的运行数据,再针对性地对热点代码执行复杂优化,因此启动速度慢于 Client 模式。
典型的深度优化包括:
循环展开:将小循环体的代码重复展开,减少循环条件判断与跳转的开销;
逃逸分析:判断对象是否会逃出当前方法或线程的作用域,若未逃逸则直接在栈上分配对象,降低 GC 回收压力;
锁消除:检测到锁对象仅被单线程访问时,自动移除同步锁的相关指令;
向量化:将标量运算转化为 CPU 的 SIMD 指令,利用硬件并行计算能力提升运算效率。
当程序进入稳定运行期后,Server 模式的深度优化可显著降低热点代码的执行耗时,其整体吞吐量远高于 Client 模式。
模式选择的默认规则与版本演进
默认模式的硬件关联
在 JDK 1.7 及之前版本中,虚拟机默认模式由硬件架构决定:
32 位系统默认使用 Client 模式,64 位系统默认使用 Server 模式。
分层编译的出现与 Client 模式的废弃
JDK 1.8:64 位系统默认启用分层编译,该模式融合了 C1 与 C2 编译器的优势 ------ 先用 C1 完成轻量编译保证启动速度,再对热点方法触发 C2 的深度优化,兼顾启动性能与运行效率,此时-client参数已基本失效。
JDK 9 及以上:直接移除了独立的 Client 模式与 C1 编译器的单独调用入口,分层编译成为默认且唯一的编译策略,从底层架构上解决了启动速度与运行性能的矛盾。
适用场景总结:
对于后台长期运行的服务端系统,在 JDK 1.7 及之前版本中,使用-server参数启动可显著提升稳定运行期的吞吐量;JDK 8 及以上版本无需手动指定,分层编译会自动实现最优策略。
对于运行时间短、追求即时响应的桌面程序,在 JDK 1.7 及之前的 32 位系统中,Client 模式是更优选择;JDK 8 及以上版本则可直接依赖分层编译的轻量优化阶段满足启动需求。
默认情况下,虚拟机会根据当前计算机系统环境自动选择运行模式,使用 -version 参数可以查看当前的模式,如下所示:
