jvm 的 client 与 server 较为详细区别

client 与 server 是两个不同的编译器。

这些编译器适合于客户端和服务器的独特性能特性。这些差异包括编译内联策略和堆默认值。

 

client:比较简单,相比server模式许多更复杂的优化,它只需要较少时间来分析和编译一段代码。

        它为应用程序和小程序提升了运行时性能。减少了启动时间和内存占用,并对GUI做了优化,以适合客户端环境。

 

server:比较复杂,先解释执行,然后jvm统计执行热点,将这些热点代码仔细优化编译成本地代码,然后执行本地代码,当这个热点不再是热点的时候,释放编译的代码,重新解释执行。

        Server VM包含一个高级自适应编译器,该编译器支持与充分利用c++编译器进行的很多想同类型的优化,以及一些传统编译器无法完成的优化,例如跨虚拟方法调用的主动内联。与静态编译器相比,这是一个竞争优势和性能优势。自适应优化技术的方法非常灵活,通常甚至优于高级静态分析和编译技术。

        相比于client模式,server模式最大程度的提升了峰值运行速度。这更适合于需要长时间运行的服务器程序。

        而比起客户端程序需要的快速启动和更小的运行内存的占用,服务器程序需要更快的运行速度。

        所以,启动时,速度较慢,但是一旦运行起来后,时间久了,性能将会有很大的提升。

        所以,这种模式适合长时间的大程序运行,所以比较适合服务器。

-------------------------------------------

找到一张图显示了java与c++的性能对比,其中可以明显看出client与server的区别。

jvm 的 client 与 server 较为详细区别

图中最显著的就是JVM client模式和Server模式关于method call的对比,那个差别不是一般的大,在后来的测试中发现,相差至少有10倍。

 

下面是另外两个对比图:

jvm 的 client 与 server 较为详细区别

jvm 的 client 与 server 较为详细区别

-------------------------------------------

下面这段话是直接从网页上搬过来的:

client与server,仅是指定服务器启动时初始化的参数值,这些默认值影响运行时的性能。
普通 PC 就工作在 client 模式就好了,特别是你的内存不是很大时不需要 server 模式,因为 server 模式是为服务器准备的,它的意思就是说这个服务器启动之后基本上不做别的,所以可以把所有内存都尽量给 JVM 使用,所以才能得到一个更好的性能。

但是 PC 机的话,因为我们频繁地在多个程序切换,每次把程序带到前台窗口或退到后台窗口都会导致 Windows 操作系统在物理内存和硬盘上的虚拟内存之间切换,这影响性能。一个常见的事情就是我们开着多个程序,并且把 Java 程序切换到最小化,另一个非 Java 程序最大化,然后我们出门吃饭 2 小时后回来把 Java 程序最大化,你会发现这个时候切换到最大化可能需要 15分钟的时间,这就是内存紧张时虚拟内存和物理内存间交换数据时导致 JVM 频繁地触发垃圾收集(GC)导致的性能问题。而这个现象在 server 模式不会出现,因为它是假设服务器专用的,而且基本上没有前台程序,都是后台程序。

JVM 并不能预测什么时候是数据从虚拟内存搬到物理内存,什么时候内存紧张又是从物理内存搬到虚拟内存,因为这是操作系统的事情,它不会让应用程序知道这件事。反正JVM在这种情况下频繁地触发"完全的“垃圾收集就导致性能问题。

 

 

参考:

https://blog.****.net/hnhygkx/article/details/80182766

https://zhidao.baidu.com/question/1703232626938481420.html

https://*.com/questions/198577/real-differences-between-java-server-and-java-client