"java-server"和"java-client"之间有什么实际的区别吗?

我在Sun的网站上能找到的只是一个模糊的

"-服务器启动较慢,但应运行较快".

真正的区别是什么?(目前正在使用JDK 1.6.0_07.)

推荐答案

这实际上与HotSpot和默认的option values(Java HotSpot VM Options)相关联,它们在客户端和服务器配置之间有所不同.

从白皮书(The Java HotSpot Performance Engine Architecture)的第Chapter 2页开始:

JDK包括两种风格的VM--客户端产品和针对服务器应用程序调优的VM.这两个解决方案共享Java HotSpot运行时环境代码库,但使用不同的编译器,以适应客户机和服务器独特的性能特征.这些差异包括编译内联策略和堆默认值.

虽然服务器和客户端虚拟机相似,但服务器虚拟机已经过专门调整,以最大限度地提高峰值运行速度.它旨在执行长时间运行的服务器应用程序,这些应用程序需要尽可能快的操作速度,而不是快速启动时间或较小的运行时内存占用.

客户机VM编译器可作为JDK早期版本使用的classic VM和即时(JIT)编译器的升级.客户端VM为应用程序和小程序提供了改进的运行时性能.Java HotSpot客户端VM经过了特别调整,以减少应用程序启动时间和内存占用,使其特别适合客户端环境.一般来说,客户机系统更适合GUI.

因此,真正的区别还在于编译器级别:

客户端VM编译器不会try 执行编译器在服务器VM中执行的许多更复杂的优化,但作为交换,它需要更少的时间来分析和编译一段代码.这意味着客户端虚拟机可以更快地启动,并且需要更小的内存占用.

服务器VM包含一个高级自适应编译器,它支持通过优化C++编译器执行的许多相同类型的优化,以及一些传统编译器无法完成的优化,例如在虚拟方法调用中的积极内联.这是相对于静态编译器的竞争优势和性能优势.自适应优化技术在方法上非常灵活,通常甚至优于高级静态分析和编译技术.

注意:jdk6 update 10的发行版(见Update Release Notes:Changes in 1.6.0_10)试图缩短启动时间,但原因与热点选项不同,它的内核要小得多.


G. Demecki points out in the comments that in 64-bit versions of JDK, the -client option is ignored for many years.
See Windows java command:

-client

Selects the Java HotSpot Client VM.
A 64-bit capable JDK currently ignores this option and instead uses the Java Hotspot Server VM.


2022年:the commentsJavaSE6 / Server-Class Machine Detection中的Holger个参考文献,增加:

Only on 32 bit Windows systems, -client was ever chosen unconditionally.
Other systems checked whether the machine was “server class” which was fulfilled when having at least 2 cores and at least 2GiB of memory.

这就解释了为什么现在几乎所有东西都使用-server已经有很长一段时间了.即使是你能找到的最便宜的计算机,也是"服务器级"的计算机.Sun/Oracle64版本甚至没有附带客户端JVM.

Java相关问答推荐

如果您仅同步写操作,Java布尔线程是否安全

如何让HikariCP指标在NewRelic中正确显示?

Java JAR环境(JRE)是否支持模块?

当一个链表中间有一个循环时,它的松散部分会发生什么?

基本时态运算的ISO-8601周数据表示法

RichFaces 3.x-Spring Boot-迁移web.xml

如何确定springboot在将json字段转换为Dto时如何处理它?

相同的Java SerializedLambda为implMethodKind返回不同的结果

JPanel透支重叠的JComcoBox

Spring Data JPA慢慢地创建了太多非活动会话

无法使用Java&;TestContainers获取AWS SQS队列的属性

如何在一行中使用Dijkstra中的Java Stream

插入中的JOOQ序列,设置为VS值

为什么我不能建立输入/输出流?Java ServerSocket

我的代码是线程安全的吗?[Java、CAS、转账]

使用MediaPlayer类在一段时间后停止播放音乐

控制器建议异常处理

Spring Mapstruct如何获取Lazy初始化实体字段的信息?

无泄漏函数的Java DRY

SonarQube在合并升级到java17后对旧代码提出错误