JVM两种运行模式Server与Client

作者:神秘网友 发布时间:2021-02-24 13:20:05

JVM两种运行模式Server与Client

JVM有两种运行模式Server与Client。两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢;但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多。这是因为Server模式启动的JVM采用的是重量级的虚拟机,对程序采用了更多的优化;而Client模式启动的JVM采用的是轻量级的虚拟机。所以Server启动慢,但稳定后速度比Client远远要快。

1. 当前是Client or Server

使用Java-version命令就能显示出当前虚拟机处于哪种模式。
Client:
如下图所示,可以看到HotSpot虚拟机采用Client模式启动的。

Server:
如下图所示,可以看到HotSpot虚拟机采用Server模式启动的。另外我们也能看到该虚拟机是64位的。如果像上面的Client图中那样不显示位数,则是32位虚拟机。所以使用java -version也能查看虚拟机是32位还是64位。

2. Client与Server切换

2.1 模式配置文件

JVM启动时采用何种模式是在名为jvm.cfg的配置文件中配置的。
在32位JDK中,jvm.cfg位置为:JAVA_HOME/jre/lib/i386/jvm.cfg;

jvm.cfg中配置:(此时为client模式)

-client KNOWN-server KNOWN-hotspot ALIASED_TO -client
-classic WARN-native ERROR-green ERROR
1
2
3
4
5
6
1
2
3
4
5
6

在64位JDK中,jvm.cfg位置为:JAVA_HOME/jre/lib/amd64/jvm.cfg。

jvm.cfg中配置:(此时为server模式)

-server KNOWN-client IGNORE-hotspot ALIASED_TO -server
-classic WARN-native ERROR-green ERROR
1
2
3
4
5
6
1
2
3
4
5
6

2.2 模式切换

如果要切换启动模式,首先要确认JDK支持哪一种或两种模式。查看JAVA_HOME/jre/bin目录下是否存在client或server目录。32位的JDK一般都支持server和client两种模式。64位的虚拟机好像只支持server模式,没有client目录。如下为32位JDK模式支持目录:

切换模式只需要将client和server的声明语句互换位置即可。如下图所示,
红框中为32位虚拟机中默认配置的client启动(已被注释掉)。蓝框中为修改之后的server模式启动。需要注意的是:在配置文件中最好不要出现空行,空行会报warning。

64位因为只支持server模式,如果我们修改了配置,启动JVM时会报错,无法启动。

性能对比

曾经有人把java与c++性能做了个对比,如图:


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

下面是另外两个对比图:



JVM工作在Server模式可以大大提高性能,但应用的启动会比client模式慢大概10%。当JVM用于启动GUI界面的交互应用时适合于使用client模式,当JVM用于运行服务器后台程序时建议用Server模式。

JVM在client模式默认-Xms是1M,-Xmx是64M;JVM在Server模式默认-Xms是128M,-Xmx是1024M。




JVM两种运行模式Server与Client 相关文章

  1. java虚拟机11:运行期优化

    编译对象与触发条件 之前讲过,Sun使用的虚拟机之所以被叫做"HotSpot",就是因为运行过程中会检测热点代码,那么运行过程中,会被即时编译器编译的"热点代码"有两类,即: 被多次调用的方法 被多次执行的循环体 前者很好理解,一个方法被调用得多了,方法体

  2. vfio_realize实际运行过程观测

    vfio_realize实际运行过程观测 使用的工具为gdb,将测试网卡通过vfio的形式透传到虚拟机中,查看vfio_realize中对于memory,中断的分配是怎样的。 用gdb启动qemu 在启动qemu之前,已经完成了以下工作: 启动host时添加了intel_iommu=on vfio-pci module的加

  3. Mybatis之两种传参小方式

    Mybatis之两种传参小方式 操作目的:更新数据库user表中的某条记录 方式一,多参数传值: mapper中的方法 int updateUser(@Param("id") int id,@Param("name") String name); userMapper中的sql update id="updateUser" update user set name= #{name} where

  4. 命令行传参

    命令行传参 有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现 public class CommandLine{public static void main(String arg[]){//args.length 数组长度for(int i=0; iargs.length; i++){System.out.println("args[" + i

  5. .Net工作流elsa-workflows官方文档学习:创建并运行定期工作流

    网页:https://elsa-workflows.github.io/elsa-core/docs/guides-recurring-task 在本节中,我们将执行以下操作: 以编程方式定义一个工作流,使用TimerEvent活动每5秒自动执行一次。 让我们开始吧! 创建控制台项目 创建一个名为Elsa.Guides.RecurringTask.

  6. Linux中ssh登陆慢的两种原因

    摘自:https://www.cnblogs.com/testlearn/p/10491899.html useDNS配置导致登陆慢 如果ssh server的配置文件(通常是 /etc/ssh/sshd_config )中设置 useDNS yes ,可能会导致 ssh 登陆卡住几十秒。将该配置项设为 no,然后重启 ssh 服务,再次登陆就恢复正

  7. zabbix监控tomcat(包含jvm监控)

    1 前言: 2 监控环境搭建 2.1 Server端配置 2.2 Tomcat服务器配置 3 监控数据采集 3.1 堆内存 3.2 内存池eden space: 3.3 内存池survivor space: 3.4 内存池old gen: 3.5 非堆内存: 3.6 内存池meta space: 3.7 内存池code cache: 3.8 内存池compressed class

  8. Azkaban 任务运行时长监控

    1、解决的痛点 各种原因导致的Azkaban任务运行假死,无法正常跑任务的情况。 2、解决方案 通过调用Azkaban API接口,获取project flow的startTime时间,通过程序进行相减,得出的值超过报警阀值进行报警。 API调用示例: 1、获取用户身份的session.id,有效

  9. 运行内存是什么

    运行内存是指程序运行时需要的内存;运行内存的大小直接决定了系统能运行多少程序,运行内存越大,系统运行程序越快。运行内存按照被使用情况可分类为:可利用物理内存、空闲物理内存、缓存物理内存、备用物理内存、已修改物理内存、被使用物理内存等等。 本

  10. 不可不知的 JVM 预热

    一、JVM 架构基础 JVM进程启动时,ClassLoader 会将需要的所有类加载到内存,主要分为以下三步: Bootstrap Class: 核心类库,由“ Bootstrap Class Loader ”负责加载,例如基础的运行时类库 JRE\lib\rt.jar 。 Extension Class : java.ext.dirs 路径下的类

每天更新java,php,javaScript,go,python,nodejs,vue,android,mysql等相关技术教程,教程由网友分享而来,欢迎大家分享IT技术教程到本站,帮助自己同时也帮助他人!

Copyright 2020, All Rights Reserved. Powered by 跳墙网(www.tqwba.com)|网站地图|关键词