JVM学习笔记之Client Server端的区别

createh53个月前 (02-01)技术教程21

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

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

一. 虚拟机

先说下本篇文章的内容都是基于HotSpot虚拟机。

我们熟知的Java虚拟机是一种规范标准,有多种实现,比如HotSpot虚拟机就是JVM的一种实现,也是目前使用范围最广的Java虚拟机。其实HotSpot最早也不是Sun开发的,是他早期收购的一家公司开发的,后来Sun把JDK开源后,OpenJDK诞生了,所以HotSpot成了这两个JDK共用的虚拟机。

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

为什么叫HotSpot虚拟机?

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

JIT具体如何编译和优化,可以参考上一篇文章里介绍的:JVM学习笔记之codeCache

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

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

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

二. 虚拟机类型client server的区别

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

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

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

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

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

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

网上有张c++和java的性能对比,如下:

可以看到最明显的差异是JVM client端和server端关于method call方法调用上的性能对比(红色是server VM,黄色是client VM,越高越好)。

另外client/server VM除了在编译策略和性能上的区别外,在内存分配和GC上也不一样:

  • client 默认-Xms是1M,-Xmx是64M,新生代选择的是串行gc,旧生代选择的是串行gc
  • server 默认-Xms是128M,-Xmx是1024M,新生代选择的是并行回收gc,旧生代选择的是并行gc

如果需要修改HotSpot虚拟机的类型可以通过%JAVA_HOME%jrelibamd64文件夹里的jvm.cfg修改(jdk版本不一样对应的目录可能不叫amd64这个名字),jvm.cfg文件内容如下:

-server KNOWN
-client IGNORE

当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是,则以ServerVM启动,否则以ClientVM启动,检测的根据是至少2个CPU和最低2GB内存。

还有一种切换方式是每次执行java命令时在后面加上-client-server的参数指定。

这里需要注意一点:无论是哪种方式切换,都是调用对应的jvm.dll执行的,所以在你本地必须有client和server各自对应的jvm.dll文件存在才行,否则无法切换虚拟机类型。

三. 虚拟机工作模式

第一张图里的最后一个圈出的mixed mode表示虚拟机的工作模式为混合模式,在命令行输入java -X可以查看其它模式:

还有一种-Xcomp表示纯编译模式。

下面讲下三种模式的区别

  1. -Xmixed 混合模式:mixed mode是HotSpot虚拟机的默认工作模式,在上篇文章中讲到过虚拟机执行字节码分两种方式:解释执行和编译执行,编译执行就是JIT(C1/C2),所以混合模式就是解释执行+编译执行(根据clientVM还是serverVM类型区分使用C1还是C2编译器),这样就可以发挥解释执行和编译执行的优势。
  2. -Xint 解释模式:interpreted mode,强制JVM以解释方式执行所有的字节码
  3. -Xcomp 编译模式:compiled mode,与-Xint相反,JVM在第一次使用时会把所有的字节码编译成本地代码(实际我测试下来的效果并不如混合模式)

解释模式和编译模式的区别上篇文章也有讲到,这里就不展开了

同样工作模式也可以切换,在命令行加上-Xint-Xcomp的参数设置:

相关文章

JavaWEB前端向服务器端发送对象(java向服务器发送数据)

最近项目中需要做一个关于批量删除的功能,删除条件有多个,需要从页面全部传给后台服务器程序,单个的删除,可以拼接参数给url,服务器端获取参数后执行删除操作即可。但是批量删除多个,参数会很多,传递就有些...

学习必备|分布式即时通讯服务端java版附源码

今日推荐:分布式即时通讯服务端推荐一款基于java开发的分布式即时通讯服务端,网络基于netty,akka实现实时信息,提供简单的API服务 ,方便二次开发。特点:1、支持单击部署,也支持集群部署2、...

Java 中的 Http 客户端 API:身份验证

.介绍在本系列的第一部分(链接此处)中,介绍了 java http 客户端 API 的基本功能。现在我们将探讨当今应用程序中广泛使用的一些更常见的用例。我们将学习如何通过提供凭据来访问安全端点。基本认...

新公司还是使用SVN,一怒之下写了这篇保姆级小白教程

现在一般开发都是协同开发了,所以会用到版本控制系统,说白了就是大家一起开发一个项目,分别写不同的代码,然后需要把代码汇总到一起,大家可能互相需要对方写的代码,就是大家共同去写一套代码,这就是需要版本控...

java快速开发低代码平台,支持前后端分离附源码

项目介绍Seezoon Stack 以快速开发为目的,在开发速度和代码结构上做出一定取舍,无论如何,你将看到非常地道的 Java 常用开发框架使用。该项目采用主流开发框架,无论打包、编译、部署都按着大...

基于springboot2.0跟layui构建的前后端分离后台管理系统源码分享

一个基于SpingBoot2.0轻量级的java快速开发框架。以Spring Framework为核心容器,Spring MVC为模型视图控制器,Mybatis Plus为数据访问层, Apache...