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

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

-服务器启动较慢,但应该运行得更快。

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


当前回答

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

其他回答

我刚刚注意到的一个不同之处在于,在“客户端”模式下,JVM似乎会将一些未使用的内存归还给操作系统,而在“服务器”模式下,一旦JVM获取了内存,它就不会将其归还。这就是它在Solaris和Java6上的显示方式(使用prstat -Z查看分配给进程的内存数量)。

上次我看了这个,(不可否认,这是一段时间以前了)我注意到的最大区别是在垃圾收集方面。

IIRC:

服务器堆VM与客户端VM具有不同的代数,并且使用不同的垃圾收集算法。这可能不再是真的了 服务器虚拟机将分配内存,不释放给操作系统使用 服务器VM将使用更复杂的优化算法,因此有更大的优化时间和内存需求

如果您可以使用jvisualvm工具比较两个java虚拟机、一个客户机和一个服务器,您应该会看到垃圾收集的频率和效果以及代的数量上的差异。

我有一对屏幕截图,很好地显示了差异,但我不能再现,因为我有一个64位JVM,它只实现了服务器VM。(我也懒得在我的系统上下载和争论32位版本。)

这种情况似乎不再是这样了,尝试在服务器和客户端vm的windows上运行一些代码,我似乎得到了相同的生成模型…

client和server系统是不同的二进制文件。它们本质上是连接到同一个运行时系统的两个不同的编译器(jit)。客户端系统最适合需要快速启动时间或占用空间小的应用程序,服务器系统最适合对整体性能最重要的应用程序。一般来说,客户端系统更适合交互式应用程序,如gui

我们在两个开关上运行以下代码:

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--) {
        }
    }
}

注意:代码只编译过一次!这两个运行中的类是相同的!

客户端: java.exe -client -classpath C:\mywork\classes com.blogspot. sdoulder . looptest 花费时间:766

-服务器: java.exe -server -classpath C:\mywork\classes com.blogspot. sdoulder . looptest 时间:0

似乎更积极的优化服务器系统,删除循环,因为它知道它不执行任何操作!

参考

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

IIRC服务器虚拟机在启动时做了更多的热点优化,所以它运行得更快,但启动时间稍长,占用更多内存。客户端VM推迟了大部分优化,以允许更快的启动。

编辑补充:这里有一些来自Sun的信息,不是很具体,但会给你一些想法。