“java -server”和“java -client”之间有什么实际的区别吗?
我在孙的网站上只能找到一个模糊的
-服务器启动较慢,但应该运行得更快。
真正的区别是什么?(目前使用JDK 1.6.0_07。)
“java -server”和“java -client”之间有什么实际的区别吗?
我在孙的网站上只能找到一个模糊的
-服务器启动较慢,但应该运行得更快。
真正的区别是什么?(目前使用JDK 1.6.0_07。)
当前回答
当从1.4版本迁移到1.7版本(“1.7.0_55”)时。我们在这里观察到的是,在客户端和服务器模式下,分配给heapsize|permsize|ThreadStackSize参数的默认值没有这种差异。
顺便说一下,(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
1.7版本的ThreadStackSize更高,而在开放JDK论坛上,有讨论指出1.7版本的帧大小略高。 人们相信,在运行时可以根据应用程序的行为来度量真正的差异
其他回答
我没有注意到两者在启动时间上有任何不同,但使用“-server”(Solaris服务器,每个人都使用SunRays来运行应用程序)时,应用程序性能的提高非常小。低于1.5。
当从1.4版本迁移到1.7版本(“1.7.0_55”)时。我们在这里观察到的是,在客户端和服务器模式下,分配给heapsize|permsize|ThreadStackSize参数的默认值没有这种差异。
顺便说一下,(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
1.7版本的ThreadStackSize更高,而在开放JDK论坛上,有讨论指出1.7版本的帧大小略高。 人们相信,在运行时可以根据应用程序的行为来度量真正的差异
来自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的信息,不是很具体,但会给你一些想法。
在旧版本的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或使用脚本更改命令行选项,那么这很有用。这也可以让你实时监控堆和永久空间的使用情况以及许多其他统计数据。