服务器“和”java

“java -server”和“java -client”之间是否有实际的区别? 我在Sun的网站上找到的所有内容都是模糊的“-server启动较慢,但应该运行得更快”。 真正的区别是什么? (目前使用JDK 1.6.0_07。)


这实际上与HotSpot和默认选项值(Java HotSpot VM选项)相关联,这些值在客户端和服务器配置之间有所不同。

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

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

尽管服务器和客户端虚拟机类似,但服务器虚拟机已经过专门调整以最大化运行速度。 它旨在用于执行长时间运行的服务器应用程序,这些应用程序需要最快的运行速度,而不仅仅是快速启动时间或更小的运行时内存占用量。

客户端VM编译器可用作旧版本JDK使用的Classic VM和准时制(JIT)编译器的升级版。 客户端VM为应用程序和小应用程序提供改进的运行时性能。 Java HotSpot客户端虚拟机经过特别调整,以减少应用程序启动时间和内存占用量,使其特别适合于客户端环境。 一般来说,客户端系统对GUI更好。

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

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

Server VM包含一个高级自适应编译器,支持通过优化C ++编译器执行的许多相同类型的优化,以及一些传统编译器无法完成的优化,例如跨虚拟方法调用的积极内联。 这比静态编译器更具竞争力和性能优势。 自适应优化技术在其方法中非常灵活,并且通常甚至胜过先进的静态分析和编译技术。

注意:jdk6更新10(请参阅更新发行说明:1.6.0_10中的更改)的发布尝试提高启动时间,但出于与热点选项不同的原因,采用与更小的内核不同的打包方式进行打包。


G. Demecki在评论中指出,在64位版本的JDK中, -client选项被忽略了很多年。
请参阅Windows java命令:

-client

选择Java HotSpot客户端VM。
目前支持64位的JDK忽略此选项,而是使用Java Hotspot Server VM


旧版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用户或模块​​,或者使用更改命令行选项的脚本,这非常有用。 这也可以让你实时监控堆和空间使用情况以及其他许多统计数据。


我刚才注意到的一个区别是,在“客户端”模式下,JVM实际上将一些未使用的内存提供给操作系统 - 而在“服务器”模式下,一旦JVM抓住内存,它就不会给它背部。 这就是它在Solaris上如何以Java6出现(使用prstat -Z来查看分配给进程的内存量)。

链接地址: http://www.djcxy.com/p/91005.html

上一篇: server" and "java

下一篇: Strange space on grid.arrange plot