“java -server”和“java -client”之间有什么实际的区别吗?
我在孙的网站上只能找到一个模糊的
-服务器启动较慢,但应该运行得更快。
真正的区别是什么?(目前使用JDK 1.6.0_07。)
“java -server”和“java -client”之间有什么实际的区别吗?
我在孙的网站上只能找到一个模糊的
-服务器启动较慢,但应该运行得更快。
真正的区别是什么?(目前使用JDK 1.6.0_07。)
当前回答
来自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
其他回答
来自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,它涉及到垃圾收集策略。其理论是客户机和服务器在短寿命对象方面是不同的,这对现代GC算法很重要。
下面是服务器模式的链接。唉,他们没有提到客户端模式。
这里有一个关于GC的非常全面的链接;这是一篇比较基础的文章。不确定地址-服务器和-客户端,但这是相关的材料。
在No Fluff Just Stuff, Ken Sipe和Glenn Vandenburg都在这方面做了很棒的演讲。
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。
上次我看了这个,(不可否认,这是一段时间以前了)我注意到的最大区别是在垃圾收集方面。
IIRC:
服务器堆VM与客户端VM具有不同的代数,并且使用不同的垃圾收集算法。这可能不再是真的了 服务器虚拟机将分配内存,不释放给操作系统使用 服务器VM将使用更复杂的优化算法,因此有更大的优化时间和内存需求
如果您可以使用jvisualvm工具比较两个java虚拟机、一个客户机和一个服务器,您应该会看到垃圾收集的频率和效果以及代的数量上的差异。
我有一对屏幕截图,很好地显示了差异,但我不能再现,因为我有一个64位JVM,它只实现了服务器VM。(我也懒得在我的系统上下载和争论32位版本。)
这种情况似乎不再是这样了,尝试在服务器和客户端vm的windows上运行一些代码,我似乎得到了相同的生成模型…
IIRC服务器虚拟机在启动时做了更多的热点优化,所以它运行得更快,但启动时间稍长,占用更多内存。客户端VM推迟了大部分优化,以允许更快的启动。
编辑补充:这里有一些来自Sun的信息,不是很具体,但会给你一些想法。