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编译只是一种概念,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的参数设置:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Asp.Net 不同的OnClick事件区别小结(onserverclick,onclientclick)

    1. HTML控件,如IMG的输入按钮等 的 onclick ( 客户端 )和 onserverclick( 服务端 )事件,注意 runat="server"... 此处的onclick先于onserverclick执行.2.WEB控件,如<asp:button 按钮等 的 onclientclick( 客户端 ) 和 onclick ( 服务端 )事件... 此处的onclientclick先于onclick执行.onclientclick  事件来自2.0, 它用来取代下列

  • 使用Java实现简单的server/client回显功能的方法介绍

    Socket是指在一个特定编程模型下,进程间通信链路的端点.因为这个特定编程模型的流行,Socket这个名字在其他领域得到了复用,包括Java叫技术. 如果要建立连接,一台机器必须运行一个进程来等待连接,而另一台机器必须试图到达第一台机器.这个电话系统类似:一方必须发起呼叫,而另一方在此时必须等待电话呼叫. java网络模型图 下面通过一个有"回显"功能的服务器和客户端来介绍应用java.net包编写网络应用程序. 这个例子主要功能是服务器端的程序等待客户的输入,然后将读取到的信息回显

  • Python Socket实现简单TCP Server/client功能示例

    本文实例讲述了Python Socket实现简单TCP Server/client功能.分享给大家供大家参考,具体如下: 网络上关于socket的介绍文章数不胜数.自己记录下学习的点点滴滴.以供将来复习学习使用. socket中文的翻译是套接字,总感觉词不达意.简单的理解就是ip+port形成的一个管理单元.也是程序中应用程序调用的接口. 在这里我们先介绍如何启动tcp 的server. tcp连接中server部分,启动一个ip和port口,在这个port口监听,当收到client发来的请求,

  • PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】

    本文实例讲述了PHP中soap用法.分享给大家供大家参考,具体如下: 一.首先要设置服务器环境 修改php.ini 得添加extension=php_soap.dll (加载soap 内置包) 修改soap.wsdl_cache_enabled=1 改为soap.wsdl_cache_enabled=0 这个是soap的缓存,测试的时候最好改为0,上线稳定了改为1 soap有两种模式一种是wsdl,一种是no-wsdl 二.熟悉几个函数 1. SoapServer SoapServer用于创建p

  • python client使用http post 到server端的代码

    复制代码 代码如下: import urllib, httplib  import utils  import json        class User: def __init__(self):              print 'a' def login(self, imsi, ua):              print "==============user start login=================="              input = {   

  • SQL Server Native Client下载 SQL Server Native Client安装方法

    在安装 SQL Server 2008 或 SQL Server 工具时,将同时安装 Microsoft SQL Server Native Client 10.0.如果计算机上还安装了 SQL Server Native Client 的 SQL Server 2005 版本,则 SQL Server Native Client 10.0 将与早期版本并行安装. Microsoft SQL Server Native Client 10.0下载:http://www.jb51.net/data

  • python实现的udp协议Server和Client代码实例

    直接上代码:Server端: 复制代码 代码如下: #!/usr/bin/env python # UDP Echo Server -  udpserver.py import socket, traceback host = '' port = 54321 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((hos

  • Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    在前面一篇文章浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路中,介绍了Service Manager是如何成为Binder机制的守护进程的.既然作为守护进程,Service Manager的职责当然就是为Server和Client服务了.那么,Server和Client如何获得Service Manager接口,进而享受它提供的服务呢?本文将简要分析Server和Client获得Service Manager的过程. 在阅读本文之前,希望读者

  • Java虚拟机JVM之server模式与client模式的区别

    JVM client模式和Server模式区别 JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升. JVM工作在Server模式下可以大大提高性能,Server模式下应用的启动速度会比client模式慢大概10%,但运行速度比Client VM要快至少有10倍 当不指定运行模式参数时,虚拟机启动检测主机是否为服务器,如果是,则以Server模式启动,否则以client模式启动,J2SE5.0检测的根据是

  • JVM Client和Server端有什么区别

    java -version 命令大家都用过,大部分就是看下jdk版本或检查下环境变量的设置,但最后一行的信息也挺重要,如下图所示: Server VM表示我们的虚拟机类型,mixed mode表示虚拟机以混合模式工作. 一. 虚拟机 先说下本篇文章的内容都是基于HotSpot虚拟机. 我们熟知的Java虚拟机是一种规范标准,有多种实现,比如HotSpot虚拟机就是JVM的一种实现,也是目前使用范围最广的Java虚拟机.其实HotSpot最早也不是Sun开发的,是他早期收购的一家公司开发的,后来S

  • Golang简单实现http的server端和client端

    介绍 HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,是一个安全通信通道,它基于HTTP开发用于在客户计算机和服务器之间交换信息.它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版,是使用TLS/SSL加密的HTTP协议. HTTP和HTTPS的区别 HTTPS是加密传输协议,HTTP是名文传输协议 HTTPS需要用到SSL证书,而HTTP不用 HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO HTTPS标准端

  • 从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例

    本文实例讲述了Node.js多页面实现数学运算的client端和server端.分享给大家供大家参考,具体如下: 1.server端 支持数学运算的服务器,服务器的返回结果用json对象表示. math-server.js //通过监听3000端口使其作为Math Wizard的后台程序 var math = require('../nodejsExample3/math.js'); var express = require('express'); var app = express(); a

  • golang 实现tcp server端和client端,并计算RTT时间操作

    server端代码: package main import ( "fmt" "net" "log" "os" ) func main() { addr := "0.0.0.0:8787" tcpAddr, err := net.ResolveTCPAddr("tcp",addr) if err != nil { log.Fatalf("net.ResovleTCPAddr f

  • QT编写tcp通信工具(Server端)

    本文实例为大家分享了QT编写Server端的tcp通信工具的具体代码,供大家参考,具体内容如下 1.说明 使用qt写一个类似网上常见的网络调试工具.此篇为Server端.Client端在上一篇. 2.基本流程 新建QTcpServer对象,为其newConnection信号写槽函数.此为新的Client连接信号,在其对应槽函数里使用nextPendingConnection方法获取Client对象,并为Client添加readyRead(读数据),disconnected(断开连接)两个信号写槽

  • Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析

    在上一篇文章中,我们分析了Android系统进程间通信机制Binder中的Server在启动过程使用Service Manager的addService接口把自己添加到Service Manager守护过程中接受管理.在这一篇文章中,我们将深入到Binder驱动程序源代码去分析Client是如何通过Service Manager的getService接口中来获得Server远程接口的.Client只有获得了Server的远程接口之后,才能进一步调用Server提供的服务. 这里,我们仍然是通过A

  • 微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)

    微信小程序Server环境配置详解 主要内容: 1. SSL免费证书申请步骤 2. Nginx HTTPS 配置 3. TLS 1.2 升级过程 微信小程序要求使用 https 发送请求,那么Web服务器就要配置成支持 https,需要先申请SSL证书 小程序也要求 TLS(传输层安全协议)的版本至少为 1.2,在配置好 https之后,如果 TLS 的版本较低,就涉及到升级问题 所以 Server端环境配置的主要步骤: 申请 SSL 证书 配置web服务器支持https(我使用的是nginx)

  • 低端路由器和高端路由器的区别

    最近看到有网友在论坛上提问:"低端路由器和高端路由器都是差不多的用法,为什么价格会相差这么远啊?"其实这个问题提得很不错,不少不熟悉产品技术的朋友基本上都会类似的疑问--"为什么一样的功能,这款路由器这么贵,另外一款又这么便宜"."为什么思科的路由器这么贵?而TP-LINK的这么便宜?"."这两款路由器的主要参数都一样,为什么性能却相差这么远?" 对于这些问题,我们都必须从路由器的基本原理谈起: 路由器的工作原理: 最简单的网

  • 由面试题加深对Django的认识理解

    1. 对Django的认识? #1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. #2.Django内置的ORM跟框架内的其他模块耦合程度高. #应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利: #理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修. #3.Django的卖点是超高的开发效

随机推荐