“java -server”和“java -client”之间有什么真正的实际区别吗?
我在 Sun 的网站上只能找到一个模糊的
“-server 启动速度较慢但应该运行得更快”。
真正的区别是什么? (目前使用 JDK 1.6.0_07。)
原文由 Paul Tomblin 发布,翻译遵循 CC BY-SA 4.0 许可协议
“java -server”和“java -client”之间有什么真正的实际区别吗?
我在 Sun 的网站上只能找到一个模糊的
“-server 启动速度较慢但应该运行得更快”。
真正的区别是什么? (目前使用 JDK 1.6.0_07。)
原文由 Paul Tomblin 发布,翻译遵循 CC BY-SA 4.0 许可协议
旧版本 Java 中最明显的直接区别是分配给 -client
的内存,而不是 -server
应用程序。例如,在我的 Linux 系统上,我得到:
$ 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"
因为它默认为 -server
,但是使用 -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"
因此 -server
大多数内存限制和初始分配对于这个 java
版本要高得多。
但是,这些值可能会因体系结构、操作系统和 jvm 版本的不同组合而发生变化。最近版本的 jvm 已经删除了标志并重新删除了服务器和客户端之间的许多区别。
还要记住,您可以使用 jvisualvm
查看正在运行的 jvm
的所有详细信息。如果您的用户或模块设置 JAVA_OPTS
或使用更改命令行选项的脚本,这将很有用。这还可以让您实时监控 堆 和 permgen 空间使用情况以及许多其他统计信息。
原文由 Mark Booth 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
这实际上与 HotSpot 和默认 _选项值_( Java HotSpot VM 选项)有关,客户端和服务器配置之间存在差异。
来自白皮书的 第 2 章( Java HotSpot 性能引擎架构):
所以真正的区别还在于编译器级别:
注意: jdk6 更新 10 的发布(请参阅 更新发布说明:1.6.0_10 中的更改)试图缩短启动时间,但出于与热点选项不同的原因,以更小的内核进行打包。
G. Demecki 在评论 中指出,在 64 位版本的 JDK 中,
-client
选项多年来一直被忽略。请参阅 Windows
java
命令:2022 年: Holger 在 评论 中 提到 JavaSE6 / Server-Class Machine Detection ,并添加: