当前位置: 首页 > news >正文

【jvm系列-01】初识虚拟机与java虚拟机

初识虚拟机与java虚拟机

  • 一,虚拟机与java虚拟机
    • 1,虚拟机
    • 2,java虚拟机
    • 3,jvm整体结构图
    • 4,jvm的架构模型
    • 5,jvm的生命周期
    • 6,jvm的种类划分
      • 6.1,Sun Classic Vm
      • 6.2,Exact VM
      • 6.3,HotSpot虚拟机
      • 6.4,JRockit虚拟机

一,虚拟机与java虚拟机

1,虚拟机

所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。他是一款软件,用来执行一系列虚拟的计算机指令。虚拟机大概可以分为系统虚拟机程序虚拟机

  • Visual Box、VMware就属于系统虚拟机,他们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。

  • 程序虚拟机的典型代表就是java虚拟机,它专门为执行单个计算机程序而设计,在java虚拟机中执行的指令被 称为Java字节码指令。

2,java虚拟机

在这里插入图片描述

主要是用来执行java字节码的虚拟机计算机,拥有独立的运行机制,其运行的java字节码也不一定只能由java语言编译而成,其他语言只要遵循该虚拟机中的规范,也可以通过解析这些字节码文件来编译。

JVM平台的各种语言可以共享Java虚拟机带来的跨平台性,优秀的垃圾回收器,以及可靠的即时编译器。Java技术的核心就是Java虚拟机,名称为Java Virtual Machine,简称JVM。所有的Java程序都运行在Java虚拟机的内部。

java虚拟机的作用

java虚拟机就是二进制字节码的运行环境,主要负责装载字节码到其内部,解释或者编译为对应平台的机器指令执行,每一条Java指令,Java虚拟机规范中都有详细的定义。比如说如何取操作数,怎么处理操作数,把结果放到哪里等。

Java虚拟机的特点

  • 一次编译,到处运行
  • 自动内存管理
  • 自动垃圾回收机制

3,jvm整体结构图

上面说到java虚拟机的简称就是jvm,而这个HotSpot VM 是目前市面上高性能虚拟机的代表作之一,它主要是采用即时编译器和解释器保存的架构来实现,其整体的结构图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aP81TW8U-1678841200349)(img/1677429350694.png)]

把这幅图从上往下看,可以分为三层:

  • 第一层就是最上面这层,就是一些Class files,就是一些二进制的字节码文件,然后需要通过一个Class的类加载器进行一个文件的加载,将这些二进制文件加入到内存当中;

  • 第二层就是运行时数据区,就是通过这个类加载器加载进来的内存区域,里面主要有一些堆栈,方法区,程序计数器等等,并且在改层中,方法区和堆是属于公共区域,是线程共享的,而其他的栈和程序计数器,都是每个线程私有的;

  • 第三层就是这个执行引擎,主要有一些即时编译器,解释器和垃圾回收器。

4,jvm的架构模型

Java编译器输入的指令流主要有两种,一种是基于栈的指令集架构,另一种是基于寄存器的指令集架构。

基于栈架构的特点

  • 设计和实现更简单,适用于资源受限的系统,比如说嵌入式设备等
  • 避开了寄存器的分配难题,而是直接使用零地址指令方式分配,即不需要分配地址,直接操作值即可
  • 由于大部分执行过程时依赖栈,因此大部分是使用零地址指令,其指令集更小,易编译
  • 由于在栈中操作,不依赖硬件,可以直接在内存中操作,其可移植性好,可以更好的实现跨平台操作

基于寄存器架构的特点

  • 性能更加优秀,执行的效率更高,可以直接在高速缓存区中工作
  • 都是需要依赖于硬件,因此其可移植性差
  • 相对于基于栈操作,寄存器会花费更少的指令去完成一项工作
  • 寄存器架构指令往往是一,二,三地址指令,一级指令的含义就是存在一个地址和一个操作,二级指令就是两个地址和两个操作值,以此类推。

架构模型总结

为了解决java的跨平台性问题,Java指令是根据这个栈指令集来进行设计的。不同平台的CPU架构不同,所以不能设计为基于寄存器的。

相对而言,栈指令集的跨平台性会更好,并且其指令集小,但是其指令会更多,其性能相较于这个寄存器会更差。

5,jvm的生命周期

jvm的生命周期主要有启动,执行和停止三个部分组成。

虚拟机的启动

在java的官方规范中,Java虚拟机的启动是通过引导类的类加载器来创建初始类的,这个类是由虚拟机的具体指定实现的,即不同商家的虚拟机所决定。

虚拟机的执行

java虚拟机的主要任务就是执行java程序。在程序开始时java虚拟机就开始运行,程序结束时java虚拟机就停止。在执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做java虚拟机的进程。

虚拟机的退出

程序正常执行结束,或者遇到异常,或者操作系统出现错误这些都会让程序结束,除了这些之外,在调用Runtime或者System系统类的时候也会让这个虚拟机退出。除此之外,在使用JNI加载或者卸载java虚拟机的时候,java虚拟机也会出现退出的情况。

6,jvm的种类划分

6.1,Sun Classic Vm

在1996java1.0版本的时候,Sun公司发布了一款名为Sun Classic VM的Java虚拟机,他同时也是第一款商用的Java虚拟机,在JDK1.4版本的时候正式被淘汰。

在这款虚拟机中,只提供解释器而没有即时编译器,如果使用这种JIT即时编译器,就需要外挂,但是在使用这个即时编译器的时候,这个解释器就不能工作,从而解释器和这个编译器就不能协同的工作,因此这个款虚拟机被淘汰。

在这里插入图片描述

解释器和这个JIT即使编译器都可以认作是一个翻译器,并且在当今流行的HotSpot虚拟机中,这两种方式是一起协同工作的。解释器就是正常用来解释字节指令的机器,而这个即时编译器有着缓存热代码的作用,可以提升工作效率。

这两者最大的区别就是:解释器响应快,但是执行效率较低,就相当于步行,但是可以一直不停;而即时编译器是需要通过编译成机器指令的,因此需要一段时间就行等待,但是一旦编译通过,那么其执行效率就很高,相当于火车。这两种是通过合作的方式共存的,当JIT即使编译器处于这个等待的状态,那么就通过解释器来执行,反之则使用这个JIT即时编译器来执行。

6.2,Exact VM

为了解决解释器和即时编译器不能共用的问题,在jdk1.2的时候,Sum提供了这个Exact VM ,准确式内存管理,虚拟机可以知道内存中的某个位置的数据具体是什么类型。但是只在Solaris平台短暂使用,在其他平台还是使用的classic Vm

6.3,HotSpot虚拟机

现在主流的还是该款虚拟机,不管是目前比较火的Oracle JDK还是OpenJdk,HotSpot都是里面的默认的虚拟机。像这个方法区的概念,就是这个虚拟机独有的。

6.4,JRockit虚拟机

主要是注重于服务端的应用,他可以不用关注程序的启动速度,因此JRockit内部不包含解释器,全部代码都靠及时编译器来完成。据研究显示,该款虚拟机是全世界最快的虚拟机。

相关文章:

【jvm系列-01】初识虚拟机与java虚拟机

初识虚拟机与java虚拟机一,虚拟机与java虚拟机1,虚拟机2,java虚拟机3,jvm整体结构图4,jvm的架构模型5,jvm的生命周期6,jvm的种类划分6.1,Sun Classic Vm6.2,Exact VM6.3&…...

「Python 基础」数据库应用编程

Python 定义了一套 DB-API,任何数据库要连接到 Python,只需要提供符合 Python 标准的数据库驱动即可; 文章目录1. 连接 SQLite1. 建表、插入数据2. 查询数据2. 连接 MySQL1. 安装驱动2. 演示连接3. SQLAlchemy1. 安装2. DBSession3. add4. qu…...

一个nginx的小项目,不写代码,实现在局域网内访问其他电脑的网页

准备工作 下载nginx //官网 https://nginx.org/en/download.html //直接下载 https://nginx.org/download/nginx-1.23.3.zip解压 下载一个html项目,或者自己随便写一个 我是直接下载的,然后使用的是第一个01 https://gitee.com/StarPort/HTML_CSSTe…...

23.3.14打卡 2022年江西省大学生程序设计竞赛(正式赛)ABL

就写了签到, 其他题没写, 这场好像3题就银了 纪念一下3.14原粥率日 比赛链接:https://ac.nowcoder.com/acm/contest/43898 A题 Special Adjustment Method 题意 给出非负整数x, y, z 你可以让其中两个数字-1, 另外一个2, 使得x2y2z2x^2y^{2}z^{2}x2y2z2最大 题解 这题很容…...

用idea操作hbase数据库,并映射到hive

依赖条件:需要有Hadoop,hive,zookeeper,hbase环境映射:每一个在 Hive 表中的域都存在于 HBase 中,而在 Hive 表中不需要包含所有HBase 中的列。HBase 中的 RowKey 对应到 Hive 中为选择一个域使用 :key 来对…...

手机解锁方法:8个顶级的 Android 手机解锁软件

一般来说,太简单的密码是不安全的,所以我们设置一个安全的密码,可能会稍微复杂一点。然而,我们可能经常会忘记复杂的密码并锁定我们的 Android 智能手机。 8个顶级的 Android 手机解锁软件 如果您遇到过这种情况并且正在寻找一种…...

JVS快速开发平台2.1.7版本,列表页配置新增特性介绍

JVS 在3月份更新了2.1.7版本,本次更新涉及到很多方面,其中包括逻辑引擎、流程引擎、列表引擎、数据处理引擎、图表配置加工等。这里我们先介绍下列表页配置引擎扩展的相关内容,我们先来看看最后配置的列表页配置的效果1、列表页展示方面&…...

【华为机试真题详解 Python实现】去除多余空格【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述示例 1解题思路参考代码前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能…...

【SpringBoot项目实战+思维导图】瑞吉外卖⑤(新增套餐、套餐分页查询、删除套餐、短信发送、手机验证码登录)

文章目录新增套餐需求分析数据模型准备工作前端页面分析代码开发根据分类查询菜品功能实现功能测试保存套餐功能实现功能测试思维导图总结套餐分页查询需求分析前端页面分析代码开发基本信息查询问题分析功能完善功能测试思维导图总结删除套餐需求分析前端页面分析代码开发功能…...

OpenAI 发布GPT-4——全网抢先体验

OpenAI 发布GPT-4 最近 OpenAI 犹如开挂一般,上周才刚刚推出GPT-3.5-Turbo API,今天凌晨再次祭出GPT-4这个目前最先进的多模态预训练大模型。与上一代GPT3.5相比,GPT-4最大的飞跃是增加了识图能力,并且回答准确性也得到显著提高。…...

C++——多态

多态分为两类静态多态:函数重载和运算符重载属于静态多态,复用函数名动态多态:派生类和虚函数实现运行时多态静态多态和动态多态的区别:静态多态的函数地址早绑定——编译阶段确定函数地址动态多态的函数地址晚绑定——运行阶段确…...

javaSE系列之类与对象

javaSE系列之类与方法什么是类类的定义书写事项什么是实例化this引用this的注意事项对象的初始化构造方法封装的概念访问限定符封装扩展之包static成员static的特性static的初始化代码块注意事项内部类1.实例内部类💗 💗 博客:小怡同学💗 &am…...

远程构建(命令、脚本构建)jenkins

在对应项目,开启远程构建开关添加API token系统设置调整用户权限获取crumbcurl调用构建 1、进入对应项目的设置页面:开启远程构建开关 2、 添加 API token:进入对应用户的设置页面 3、系统设置调整权限,如图 4、由于jenkins的安全…...

2023-03-15 ElasticSearch

ElasticSearch 1.Docker安装ElasticSearch 1.1. es及kibana下载 docker pull elasticsearch:7.4.2 docker pull kibana:7.4.2创建映射文件: mkdir -p /elasticsearch/configmkdir -p /elasticsearch/datamkdir -p /elasticsearch/plugins在config下执行 vim elasticsearch…...

指针和数组笔试题解析【下篇】

文章目录👁️6.指针笔试题👀6.1.试题(1)👀6.2.试题(2)👀6.3.试题(3)👀6.4.试题(4)👀6.5.试题(5&am…...

DHCP原理简析及交互实践

环境: os:centos7 dnsmasq:version 2.76 一. dhcp工作原理 首先补充几个dhcp相关的基本概念: 1、动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种网络管理协议,用于集中对用…...

用二极管、三极管和MOS管搭建逻辑门电路

文章目录1. 二极管(1)二极管与门(2)二极管或门2. 三极管(1)三极管非门(2)三极管与门(3)三极管或门(4)三极管与非门(5&…...

SpringBoot:手写一个 SpringBoot Starter

声明:原文作者:yuan_404 文章目录1. 说明2 . 编写启动器3 . 新建项目测试自己写的启动器1. 说明 启动器模块是一个 空 jar 文件,仅提供辅助性依赖管理,这些依赖可能用于自动装配或者其他类库 命名归约: 官方命名&…...

【23】Verilog进阶 - 数位转换【实时处理 + 标志信号】

【初次尝试】VL32 非整数倍数据位宽转换24to128 1 理解题目含义 根据【模块端口】和【题目描述】本题的真实意思是比较清楚啦。但不可大意轻敌! (1)问题1:输出一直为0 猛然间发现计数值也为0,没有增加 去排查cnt的代码,很容易找到到问题,是cnt上电复位的逻辑写错了 …...

常见的HTTP状态码

一.2开头 200:响应成功; 204:响应成功,但是响应头没有数据; 206:部分响应成功,比如分片上传,断点续传; 二.3开头 301:永久重定向; 302&…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...