“之间的真正区别”;“java-server”;及;java-客户机;?

“之间的真正区别”;“java-server”;及;java-客户机;?,java,jvm,jvm-hotspot,Java,Jvm,Jvm Hotspot,“java-server”和“java-client”之间有实际的区别吗 我在Sun的网站上只能找到一个模糊的 “-服务器启动较慢,但应运行较快” 真正的区别是什么?(目前正在使用JDK 1.6.0_07。)我没有注意到这两个版本在启动时间上有任何差异,但通过“-server”(Solaris服务器,每个人都使用SunRays来运行应用程序),应用程序性能的提高非常小。这低于1.5。IIRC服务器虚拟机在启动时会进行更多热点优化,因此运行速度更快,但启动时间稍长,并使用更多内存。客户机VM推迟了

“java-server”和“java-client”之间有实际的区别吗

我在Sun的网站上只能找到一个模糊的

“-服务器启动较慢,但应运行较快”


真正的区别是什么?(目前正在使用JDK 1.6.0_07。)

我没有注意到这两个版本在启动时间上有任何差异,但通过“-server”(Solaris服务器,每个人都使用SunRays来运行应用程序),应用程序性能的提高非常小。这低于1.5。

IIRC服务器虚拟机在启动时会进行更多热点优化,因此运行速度更快,但启动时间稍长,并使用更多内存。客户机VM推迟了大部分优化,以允许更快的启动


编辑添加:来自Sun,它不是很具体,但会给你一些想法。

IIRC,它涉及垃圾收集策略。理论上,客户机和服务器在短期对象方面是不同的,这对于现代GC算法很重要

在服务器模式下。唉,他们没有提到客户端模式

关于一般的GC;这是一个很好的例子。不确定地址是服务器还是客户端,但这是相关资料

Ken Sipe和Glenn Vandenburg在这方面都做了很好的讨论。

这实际上与HotSpot和默认选项值()有关,它们在客户端和服务器配置之间是不同的

从白皮书()的第页:

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

尽管服务器和客户机虚拟机相似,但服务器虚拟机经过了专门调整,以最大限度地提高峰值运行速度。它用于执行长时间运行的服务器应用程序,这些应用程序比快速启动时间或更小的运行时内存占用更需要最快的运行速度

客户机VM编译器作为JDK早期版本使用的经典VM和实时(JIT)编译器的升级。客户端VM为应用程序和小程序提供了改进的运行时性能。JavaHotSpot客户机VM经过了专门调整,以减少应用程序启动时间和内存占用,使其特别适合于客户机环境。一般来说,客户机系统更适合GUI

因此,真正的区别也在编译器级别上:

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

服务器VM包含一个高级的自适应编译器,它支持通过优化C++编译器执行的许多相同类型的优化,以及一些传统编译器无法完成的优化,例如在虚拟方法调用中的积极内联。这是相对于静态编译器的竞争优势和性能优势。自适应优化技术在方法上非常灵活,通常甚至优于高级静态分析和编译技术

注意:jdk6更新10(请参阅)的发行版试图缩短启动时间,但原因与热点选项不同,它采用了更小的内核进行不同的打包


指出在64位版本的JDK中,
-client
选项多年来一直被忽略。
见:

选择Java热点客户端虚拟机。
支持64位的JDK当前忽略此选项,而是使用Java Hotspot Server VM


我刚刚注意到的一个区别是,在“客户机”模式下,JVM实际上会将一些未使用的内存返回给操作系统,而在“服务器”模式下,JVM一旦获取内存,就不会将其返回。不管怎么说,这就是在装有Java6的Solaris上出现的情况(使用
prstat-Z
查看分配给进程的内存量)。

旧版本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\u选项
,或者使用了更改命令行选项的脚本,这将非常有用。这还可以让您实时监控堆和permgen空间的使用情况以及许多其他统计信息。

Oracle的在线文档提供了一些有关JavaSE7的信息

在Windows页面上,64位JDK中忽略了
-client
选项:

选择Java热点客户端VM。支持64位的jdk当前会忽略此选项,而是使用JavaHotSpot服务器VM

但是(为了使事情有趣),在
-server
下,它指出:

选择Java热点服务器VM。在支持64位的jdk上,只支持JavaHotSpot服务器VM,因此-Server选项是隐式的。这可能会在将来的版本中更改

T
$ 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"
initial heap size of 1/64 of physical memory up to 1Gbyte
maximum heap size of ¼ of physical memory up to 1Gbyte
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--) {
        }
    }
}