现实之间的差异"java-服务器"和"java-客户"?
-
10-07-2019 - |
题
是否有任何真正的实际之间的差异"java-服务器"和"java-客户"?
所有我能找到关于太阳的网站是一个模糊的
"-服务器启动速度较慢,但应该更快"。
什么是真正的差异?(使用JAVA1.6.0_07目前.)
解决方案
这是真正的联系 热点 和默认的 选择值 (Java热点VM的选择 的),这之间有所不同客户和服务结构。
从 第2章 本白皮书(Java热点发动机的性能的建筑):
The JAVA包括两种口味的VM-一个客户端的提供,以及一个虚拟机关的服务器应用程序。这两个方案分享Java热点的运行环境码的基础,但使用不同的编译器,适合于明显的独特性能特征的客户和服务器。这些差异包括汇编内联的政策和堆默认。
虽然在服务器和客户的虚拟机是相似的,VM服务器已经被专门调整,以最大限度地高峰期的工作速度。它的目的是为执行长期运行的服务器应用,这需要尽可能快工作速度超过一个快速启动时间或更小的运行时记忆的足迹。
客户VM编译器作为一种升级对这两个经典的VM及时(JIT)编译器使用的以前版本的JAVA.客户VM提供改善运行时性应用程序和小程序。Java热点客户VM已经专门调整,以减少应用程序的启动时间和存储器的足迹,使得它尤其适用于客户环境。在一般情况下,在客户系统为更好地对图形用户界面。
所以真正的区别也是在编译器的水平:
客户VM编译器不会尝试执行的许多更复杂的优化执行的编译器在服务器虚拟机,但作为交换,它需要较少时间来分析和汇编一段代码。这意味着客户的虚拟机可以开始了快速需要一个较小的存储排放。
VM服务器包含一种先进的自适应编译器,它支持许多相同类型的优化执行的优化C++编译器,以及一些优化,不能通过传统编译器,例如侵略性的内联虚拟方法调用。这是一个具有竞争力和性能优势的静态的编译器。自适应优化技术是非常灵活的做法,并且通常优于甚至先进的静态分析和汇编技术。
注:释放 jdk6更新10 (见 更新的版本说明:变化中的1.6.0_10)试图改善的启动时间,但对于一个不同的原因在于热点的选项,正在包装的方式不同,与一个更小的核心。
G.Demecki 点了 在评论 在64位版本的JAVA, -client
选择忽略多年。
看看 Windows java
命令:
-client
选择Java热点客户的虚拟机。
64位能够JAVA目前忽略了这个选项,而是使用Java热点服务器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"
因为它默认为java
,但与jvm
选项我得到:
$ 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"
因此与jvisualvm
大多数的内存限制和初始分配是用于此高得多JAVA_OPTS
版本。
这些值可以为操作系统然而架构的不同组合,和JVM版本改变。 JVM的最新版本的已删除标志和除去许多服务器和客户端之间的区别的。
别忘了,你可以看到正在运行的<=>使用<=>的所有细节。如果你有谁或模块,这些模块设置<=>或使用脚本,修改命令行选项的用户,这非常有用。这也将让你监控,实时的堆的和的的PermGen 的空间使用率,有很多其他属性的一起。
我刚刚注意到一个不同之处是,在“客户端”模式,似乎JVM的实际提出了一些未使用的内存返回给操作系统,而与“服务器”模式,一旦抓住JVM内存,它赢得了”牛逼还给。这就是它在Solaris如何出现带有的Java6反正(使用prstat -Z
看分配给进程的内存量)。
-client和-server系统是不同的二进制文件。他们本质上是两个不同的编译器(JIT们)的接口相同的运行系统。客户端系统是最适合其需要快速启动时间或小脚印应用程序,服务器系统是最适合于整体性能是最重要的应用。一般来说,客户端系统是更适合于交互式应用,如图形用户界面
我们用两个开关运行下面的代码:
package com.blogspot.sdoulger;
public class LoopTest {
public LoopTest() {
super();
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
spendTime();
long end = System.currentTimeMillis();
System.out.println("Time spent: "+ (end-start));
LoopTest loopTest = new LoopTest();
}
private static void spendTime() {
for (int i =500000000;i>0;i--) {
}
}
}
注意:中的代码被编译只有一次!类在两个试验一样!
。通过-client:强>结果 java.exe的-client -classpath C:\ MYWORK \类com.blogspot.sdoulger.LoopTest结果 花费时间:766
。通过-server:强>结果 java.exe的-server -classpath C:\ MYWORK \类com.blogspot.sdoulger.LoopTest结果 花费时间:0
看来,服务器系统的更积极的优化调度,消除环路,因为它明白,它不执行任何操作!
Oracle的在线文档为Java SE 7的一些信息。
在爪哇 - 适用于Windows的Java应用程序启动页中,-client
选项是在64位JDK忽略:
选择了Java HotSpot客户VM。 64位计算能力的JDK会忽略这个选项,而是使用了Java HotSpot的服务器VM。
然而(使事情有趣),下-server
它指出:
选择了Java HotSpot的服务器VM。在64位计算能力的JDK只是Java HotSpot的服务器VM支持这样-server选项是隐含的。这是在将来的版本中改变。
在服务器级计算机检测页面给出的信息在其上的VM OS和体系结构选择。
我不知道有多少的适用于JDK 6。
IIRC服务器虚拟机在启动时做多热点优化,所以它运行速度更快,但需要一点时间来启动和使用更多的内存。客户机VM推迟最优化,以允许更快的启动。
编辑补充:这里的一些信息来自Sun 的,它不是很具体,但会给你一些想法。
从Goetz-Java并行做法:
- 调试提示:对于服务器应用程序,以确保始终指定的
-server
JVM命令线开关的时候援引的JVM, 甚至于 开发和测试.服务器JVM执行更多的优化 于客户JVM,例如起重变量的一环, 不修改的循环;代码,可能会出现工作 发展环境(客户JVM)可以打破的部署 环境(服务器JVM)。例如,我们"被遗忘"的声明 可变睡着了如挥发性清单3.4, 服务器JVM能 提升机测试的循环(把它变成一个无限循环),但是 客户JVM不会.一个无限循环,显示在 发展是成本远远低于一个只出现在 生产。清单3.4.数羊。
volatile boolean asleep; ... while (!asleep) countSomeSheep();
我的重点。情况因人而异
IIRC,它涉及垃圾回收策略。该理论认为,客户端和服务器将在短暂的对象,这是现代GC算法重要的方面不同。
这里是服务器模式中的链接。可惜的是,他们不提客户端模式。
这里是关于GC一般非常彻底的链接;这是href="http://chaoticjava.com/posts/how-does-garbage-collection-work/" rel="noreferrer">更基本的文章一个
目前无绒毛只是把这些东西,都肯刀槽花纹和Glenn范登堡做这种事情大了会谈。
我没有注意到在2之间启动时间的任何区别,但是主频应用性能一个很小的改进与“-server”(Solaris服务器上,利用太阳光来运行应用程序每个人)。这是1.5下。
我最后一次看看这个,(并不可否认这是一个同时回)最大的差别,我注意到的是在垃圾收集。
请参考:
- 服务器堆VM具有不同数目的代比的客户虚拟机,和一种不同的垃圾收集的算法。 这可能不是真实的了
- 服务器虚拟机将分配的记忆,而不是释放到操作系统
- 服务器虚拟机将使用更复杂的优化算法,因此有更大的时间和存储要求优化
如果你可以比较两个java Vm,一个客户,一个服务器的使用 jvisualvm 工具,你应该看到一个不同的频率和效果的垃圾收集,以及在数代人。
我有一对截图显示的差别真的很好,但我不能再为我有64位JVM其中只有实行服务器虚拟机。(我不能打扰下载和争论的32位的版本,我的系统上。)
这似乎不是这种情况了,具有试图运行一些代码在windows服务器和客户的虚拟机,我似乎得到相同产生的模型。
当做从1.4至1.7的迁移(“1.7.0_55”),我们在这里观察到的东西稿。,存在在分配给HEAPSIZE默认值没有这样的差别|在客户机服务器模式ThreadStackSize参数| permsize。
顺便提及,( http://www.oracle.com/ technetwork / JAVA / ergo5-140223.html )。这是从上述链接截取的片段。
initial heap size of 1/64 of physical memory up to 1Gbyte
maximum heap size of ¼ of physical memory up to 1Gbyte
ThreadStackSize是在1.7以上,同时通过打开JDK版面去,有其中指出帧大小是在1.7版本稍高的讨论。 据认为真正的区别可能是可能根据您的应用程序的行为在运行时间来衡量