“java -server”和“java-client”之间的真正区别?

问题:

“java -server”和“java-client”之间有什么实际的区别吗?我可以在Sun的网站上找到一个模糊的“-server开始慢,但应该跑得更快”。真正的区别是什么? (目前使用JDK 1.6.0_07)

回答:

这真的与HotSpot和默认option valuesJava HotSpot VM Options)链接,客户端和服务器配置之间有所不同。
从白皮书(The Java HotSpot Performance Engine Architecture)的Chapter 2开始:

JDK包括VM的两种口味 – 客户端产品,以及针对服务器应用程序调整的VM。这两个解决方案共享Java HotSpot运行时环境代码库,但使用不同的编译器来适应客户端和服务器的独特性能特征。这些差异包括编译策略和堆默认值。
虽然服务器和客户端虚拟机类似,服务器虚拟机已经被特别调整,以最大化最高运行速度。它旨在执行长时间运行的服务器应用程序,它们需要尽可能快的运行速度,而不仅仅是快速启动时间或更短的运行时内存占用。
客户端VM编译器作为旧版本JDK使用的经典虚拟机和即时(JIT)编译器的升级。客户端虚拟机为应用程序和小程序提供更好的运行时性能。 Java HotSpot客户端虚拟机已经过专门调优,可以减少应用程序启动时间和内存占用,使其特别适合客户端环境。一般来说,客户端系统更适合GUI。

所以真正的区别也在于编译器级别:

客户端VM编译器不会尝试执行服务器虚拟机中编译器执行的许多更复杂的优化,但作为交换,它需要更少的时间来分析和编译一段代码。这意味着客户端虚拟机可以启动更快,并需要更小的内存占用。
服务器VM包含一个高级自适应编译器,它支持通过优化C ++编译器执行的许多相同类型的优化,以及传统编译器无法完成的一些优化,例如跨虚拟方法调用的积极内联。与静态编译器相比,这是一个竞争优势和性能优势。自适应优化技术在其方法上非常灵活,并且通常优于甚至先进的静态分析和编译技术。

注意:jdk6 update 10(参见Update Release Notes:Changes in 1.6.0_10)的发布尝试提高启动时间,但是由于与热点选项不同的原因,与较小内核的打包方式不同。
 G. Demecki指出in the comments在64位版本的JDK中,-client选项被忽略多年。
Windows java command

-client

选择Java HotSpot Client VM。
64位功能的JDK当前忽略此选项,而是使用Java Hotspot Server VM

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Real differences between “java -server” and “java -client”?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

66 − = 61