JVM的Client和Server区别

VM的Client和Server是指JVM的两种不同的编译模式。

JVM的Client模式:

  1. 优化快速启动时间和应用程序的响应性能;

  2. 编译器使用C1编译器,快速编译,但代码质量不如Server模式;

  3. 适用于单线程程序;

  4. 可能会牺牲执行速度来实现快速启动时间。

JVM的Server模式:

  1. 优化长时间运行的性能,对响应时间要求不高的应用程序使用;

  2. 编译器使用C2编译器,优化编译,生成高质量的本地代码,执行效率高;

  3. 适用于多线程、多用户并发的应用程序;

  4. 对于一些需要长时间运行的服务,如Web应用、数据库等,使用Server模式可以大大提高性能。

总体来说,Client模式更适用于桌面应用程序,Server模式更适用于服务器应用程序。但是,随着JVM的不断改进,两种模式的性能差距已经不像以前那么明显了。

 

一般情况下,如果不确定使用哪种模式,建议使用默认模式。在Java 8及之前的版本中,JVM默认使用Client模式;在Java 9及更高版本中,默认使用Server模式。

如果需要在程序中指定使用某种模式,可以使用以下命令行参数:

  1. Client模式:-client

  2. Server模式:-server

另外,如果需要进一步优化性能,可以通过JVM参数进行调优。

 

java -version 命令大家都用过,大部分就是看下jdk版本或检查下环境变量的设置,但最后一行的信息也挺重要,如下图所示:

Server VM表示我们的虚拟机类型,mixed mode表示虚拟机以混合模式工作。

 

除了HotSpot虚拟机,Oracle原来的JRockit VM也是Java虚拟机的实现(后面会把HotSpot和JRockit整合),还有IBM也有对应的VM实现。

为什么叫HotSpot虚拟机?

如同它的名字,它的特点就是热点代码探测技术,这个技术可以通过执行计数器找出最具有编译价值的代码,然后通过JIT即时编译成机器码并缓存起来,提高执行效率。

而JIT编译只是一种概念,HotSpot内置C1,C2这两种编译器实现:

C1:编译时间短,优化策略简单C2:编译时间长,优化策略复杂

C1,C2都属于JIT编译技术,是JIT的不同实现。

HotSpot虚拟机分client端和server端,准确的说应该是分两种类型,因为client,server VM是两种适用不同业务场景的虚拟机类型。

  • client VM 使用的是C1编译器
  • server VM 使用的是C2编译器

在第一张图中圈出的Server VM使用的就是C2编译器。

所以clientserver最大的区别就是C1和C2的区别,主要体现在编译策略上:

  • Client启动快,内存占用少,编译快,针对桌面应用程序优化(比如GUI),为在客户端环境中减少启动时间而优化
  • Server启动慢,但是一旦运行起来后,性能将会有很大的提升,因为编译更完全,效率高,针对服务端应用优化

大家可以根据具体的业务场景选择,不过现在的系统大部分都是B/S架构,前后端又是分离的,所以我们用的虚拟机大部分都是server类型。

 

posted @ 2023-05-10 16:52  噗噗噗i丶  阅读(416)  评论(0编辑  收藏  举报