乐趣区

关于java:JVM学习笔记之Client-Server端区别

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的参数设置:

文章起源:http://javakk.com/207.html

退出移动版