JVM Client和Server端有什么区别
作者:Java老K 发布时间:2023-08-05 22:49:53
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编译只是一种概念,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编译器。
所以clientserver最大的区别就是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表示纯编译模式。
下面讲下三种模式的区别
-Xmixed 混合模式:mixed mode是HotSpot虚拟机的默认工作模式,在上篇文章中讲到过虚拟机执行字节码分两种方式:解释执行和编译执行,编译执行就是JIT(C1/C2),所以混合模式就是解释执行+编译执行(根据clientVM还是serverVM类型区分使用C1还是C2编译器),这样就可以发挥解释执行和编译执行的优势。
-Xint 解释模式:interpreted mode,强制JVM以解释方式执行所有的字节码
-Xcomp 编译模式:compiled mode,与-Xint相反,JVM在第一次使用时会把所有的字节码编译成本地代码(实际我测试下来的效果并不如混合模式)
解释模式和编译模式的区别上篇文章也有讲到,这里就不展开了
同样工作模式也可以切换,在命令行加上-Xint或-Xcomp的参数设置:
来源:https://www.cnblogs.com/maoyx/p/13967116.html
猜你喜欢
- 前言AndroidStudio升级到3.0之后,gradle版本也随之升级到了3.0.0版本。当gradle插件升级到3.0.0及以上后,我
- 一、加密方案介绍对接口的加密解密操作主要有下面两种方式:自定义消息转换器优势:仅需实现接口,配置简单。劣势:仅能对同一类型的MediaTyp
- 1. 插入排序步骤:1.从第一个元素开始,该元素可以认为已经被排序2.取下一个元素tem,从已排序的元素序列从后往前扫描3.如果该元素大于t
- 这篇文章主要介绍了springmvc如何使用POJO作为参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 背景:本人不是Java开发人员,经过四年多的历练,可以说是一枚BI攻城师了吧,最近粗糙的写了一个Portal来集成cognos报表,下面就入
- Spring main方法调用Dao层和Service层的方法在web环境中,一般serviceImpl中的dao之类的数据库连接都由容器启
- 摘要:这个问题算是老生常谈了,我也是一段时间没弄过了,所以感觉有些忘了,就记录一下。一、后端通过shiro在session中存储数据://
- 前言最近碰到了Mybatis一对多查询的场景,在这里总结对比下常见的两种实现方式。本文以常见的订单表和订单详情表来举例说明;数据库表准备订单
- 很久没写文章了,一方面是最近几个月比较忙,没太多时间,另一方面是最近拖延症严重,写文章的想法总是一拖再拖。今天找一个小案例写一下,与懒惰对抗
- 1、 流的继承关系,以及字节流和字符流。2、 节点流FileOutputStream和FileInputStream和处理流Buffered
- 方式一public class Test{ public static void main(String[] args) throws Ex
- 本文实例为大家介绍了Java九大内置对象,供大家参考,具体内容如下1、Request对象该对象封装了用户提交的信息,通过调用该对象相应的方法
- Java 方法执行时的动态分派和静态分派是 Java 实现多态的本质背景Java 的动态分派和静态分派也是 Java 方法的执行原理。 Ja
- 问题(1)自己动手写一个锁需要哪些知识?(2)自己动手写一个锁到底有多简单?(3)自己能不能写出来一个完美的锁?简介本篇文章的目标一是自己动
- jmap命令可以打印java进程的JVM堆信息,今天在某台机器上运行该命令查看 19560进程的堆信息jmap -heap 19560出现以
- 正确使用并行流,避免共享可变状态错用并行流而产生错误的首要原因,就是使用的算法改变了某些共享状态。下面是另一种实现对前n个自然数求和的方法,
- 本文实例讲述了C#中HttpWebRequest的用法。分享给大家供大家参考。具体如下:HttpWebRequest类主要利用HTTP 协议
- SpringBoot分离打Jar包的两种方式方式一:基于maven-jar-plugin此方式基于这个小伙伴的配置改的:https://ww
- redis redisson 集合操作相关类及接口Rlist:链表public interface RList<V> exten
- 本文实例讲述了Java设计模式之工厂模式实现方法。分享给大家供大家参考,具体如下:工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体