“java -server”和“java -client”之间有什么实际的区别吗?
我在孙的网站上只能找到一个模糊的
-服务器启动较慢,但应该运行得更快。
真正的区别是什么?(目前使用JDK 1.6.0_07。)
“java -server”和“java -client”之间有什么实际的区别吗?
我在孙的网站上只能找到一个模糊的
-服务器启动较慢,但应该运行得更快。
真正的区别是什么?(目前使用JDK 1.6.0_07。)
当前回答
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
似乎更积极的优化服务器系统,删除循环,因为它知道它不执行任何操作!
参考
其他回答
Oracle的在线文档提供了Java SE 7的一些信息。
在Windows的java应用程序启动器页面上,在64位JDK中-client选项会被忽略:
选择“Java HotSpot Client”虚拟机。支持64位的jdk目前忽略了这个选项,而是使用Java HotSpot Server VM。
然而(为了让事情变得有趣),在-server下它声明:
选择Java热点服务器虚拟机。在支持64位的jdk上,只支持Java HotSpot Server VM,因此-server选项是隐式的。这可能会在未来的版本中更改。
服务器类机器检测页面提供了根据操作系统和体系结构选择虚拟机的信息。
我不知道这其中有多少适用于JDK 6。
来自Goetz - Java并发实践:
Debugging tip: For server applications, be sure to always specify the -server JVM command line switch when invoking the JVM, even for development and testing. The server JVM performs more optimization than the client JVM, such as hoisting variables out of a loop that are not modified in the loop; code that might appear to work in the development environment (client JVM) can break in the deployment environment (server JVM). For example, had we “forgotten” to declare the variable asleep as volatile in Listing 3.4, the server JVM could hoist the test out of the loop (turning it into an infinite loop), but the client JVM would not. An infinite loop that shows up in development is far less costly than one that only shows up in production.
清单3.4。数羊。 挥发布尔睡眠; ... 而(!睡着了) countSomeSheep ();
我的重点。YMMV
IIRC服务器虚拟机在启动时做了更多的热点优化,所以它运行得更快,但启动时间稍长,占用更多内存。客户端VM推迟了大部分优化,以允许更快的启动。
编辑补充:这里有一些来自Sun的信息,不是很具体,但会给你一些想法。
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
似乎更积极的优化服务器系统,删除循环,因为它知道它不执行任何操作!
参考
在旧版本的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或使用脚本更改命令行选项,那么这很有用。这也可以让你实时监控堆和永久空间的使用情况以及许多其他统计数据。