"java -server" 和 "java -client" 之间的真正区别是什么?
"java -server" 和 "java -client" 之间的真正区别是什么?
\"java -server\" 和 \"java -client\" 有什么实际的差别吗?在 Sun 的网站上只找到模糊的一句话:\"-server 启动慢但应该运行更快\"。真正的区别在哪里?(目前使用的是JDK1.6.0_07)
在早期版本的Java中,最明显的一个即时差别就是分配给-client
和-server
应用程序的内存。例如,在我的Linux系统上,默认情况下为-server
,我得到:
$ java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version' uintx AdaptivePermSizeWeight = 20 {product} uintx ErgoHeapSizeLimit = 0 {product} uintx InitialHeapSize := 66328448 {product} uintx LargePageHeapSizeThreshold = 134217728 {product} uintx MaxHeapSize := 1063256064 {product} uintx MaxPermSize = 67108864 {pd product} uintx PermSize = 16777216 {pd product} java version "1.6.0_24"
,但是使用-client
选项我得到:
$ java -client -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version' uintx AdaptivePermSizeWeight = 20 {product} uintx ErgoHeapSizeLimit = 0 {product} uintx InitialHeapSize := 16777216 {product} uintx LargePageHeapSizeThreshold = 134217728 {product} uintx MaxHeapSize := 268435456 {product} uintx MaxPermSize = 67108864 {pd product} uintx PermSize = 12582912 {pd product} java version "1.6.0_24"
,因此,对于这个java
版本,使用-server
时,大多数内存限制和初始分配都要高得多。然而,这些值对于不同的架构、操作系统和jvm版本组合可能会有所改变。近期的jvm版本已经删除了许多标志,并消除了许多服务器和客户端之间的差别。还要记住,您可以使用jvisualvm
查看运行中的jvm
的所有详细信息。如果您有用户或模块设置了JAVA_OPTS
或使用更改命令行选项的脚本,则这很有用。这还能让您实时监测堆和permgen空间使用情况以及许多其他统计信息。
这个问题实际上和HotSpot及其默认选项值(Java HotSpot VM选项)有关,客户端和服务器配置的选项值不同。
来自于白皮书(Java HotSpot性能引擎架构)第2章:
JDK包括两种VM - 用于客户端和服务器应用程序的VM。这两个解决方案共享Java HotSpot运行时环境代码库,但使用不同的编译器,适合于客户端和服务器的不同性能特征。这些差异包括编译内联策略和堆默认值。
尽管服务器VM和客户VM相似,但服务器VM经过特殊调整,以最大限度地增强峰值操作速度。它适用于执行需要最快操作速度而非快速启动时间或更小的运行时内存占用的长时间运行的服务器应用程序。
客户端VM编译器作为一种升级,可提供提高应用程序和小应用运行时性能。 Java HotSpot客户端VM已经过特殊调整,以减少应用程序启动时间和内存占用量,使其特别适合客户端环境。通常情况下,客户端系统更适合GUI。
因此,真正的区别也在编译器级别上:
客户端VM编译器不尝试执行服务器VM中执行的许多更复杂的优化,但是作为交换,它需要更少的时间分析和编译代码段。这意味着客户端VM可以更快地启动,并且需要更小的内存占用。
服务器VM包含一个高级自适应编译器,它支持许多优化C ++编译器执行的相同类型的优化,以及一些传统编译器无法执行的优化,例如跨虚拟方法调用的攻击性内联。这是静态编译器的竞争和性能优势。自适应优化技术在其方法上非常灵活,并且通常表现优于高级静态分析和编译技术。
注意:jdk6更新10的发布(请参阅更新发布说明:1.6.0_10中的更改)尝试提高启动时间,但原因与热点选项不同,并使用了一个更小的内核。
G. Demecki指出,在64位版本的JDK中,-client
选项已经被忽略了好多年。
参见Windows的java
命令:
-client
选择Java HotSpot Client VM。
当前64位JDK会忽略此选项并使用Java Hotspot Server VM。
2022年:Holger在评论中引用了JavaSE6 / Server-Class机器检测,补充说:
只有在32位Windows系统上,
-client
才是无条件的选择。
其他系统会检查机器是否“服务器级别”,这是满足至少具有2个核心和至少2GiB内存的条件时才会成立。这就解释了为什么现在几乎所有东西都已经使用
-server
。即使是你能找到的最便宜的电脑,也是“服务器级别”的机器。Sun/Oracle 64位版本甚至没有提供客户端JVM。