服务器“和”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