“java -server”和“java -client”之间有什么实际的区别吗?
我在孙的网站上只能找到一个模糊的
-服务器启动较慢,但应该运行得更快。
真正的区别是什么?(目前使用JDK 1.6.0_07。)
“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的信息,不是很具体,但会给你一些想法。