JVM 虚拟机 ---> JVM 基础概念

2023-11-10

JVM 虚拟机 —> JVM 基础概念

一、Java 跨平台

  • Java是一种可跨平台的编程语言,我们通常把CPU处理器与操作系统构成的计算机系统整体成为叫平台
  • 不同的CPU,差异主要在底层指令集不同,指令集分为精简指令集(RISC)和复杂指令集(CISC)。每个CPU都有自己的特定指令集

**指令集:**是CPU中用来计算和控制计算机系统的一套指令集合

  • 不同的操作系统,支持不同的CPU,严格来说,不同的操作系统支持不同的CPU指令集。例如:早期的Mac操作系统只支持PowerPC,不能安装在IntelCPU上。
  • 现在WindowsLinuxMACSolaris都支持IntelAMD CPU指令集

主要原因

  • Java 可以跨平台的主要原因是有 JVM
  • 不同的平台,使用不同的 JVM

Java 源代码在编译后会生成一个 Class 文件,称为字节码文件,JVM负责将字节码文件翻译成特定平台下的机器码,然后运行

简单来讲,Java的跨平台就是因为不同版本的 JVM。只要在不同的平台上安装相应的JVM,就可以运行字节码文件.class)并运行我们编写的Java程序。

在这个过程中,我们编写的Java程序没有做任何改动,只是通过JVM的“中间层”,就可以在不同的平台上运行,真正实现了“一次编译,到处运行(write once,run anywhere)”的目的。

综上所述,JVM是跨平台的桥梁和中间件,是实现跨平台的关键。首先将Java代码编译成字节码文件,然后通过JVM将其翻译成机器语言,从而达到运行Java程序的目的。因此,运行Java程序必须有JVM的支持,因为编译的结果不是机器代码,必须在执行前由JVM再次翻译

注意:编译的结果不是生成机器代码,而是生成字节码。字节码不能直接运行,必须由JVM转换成机器码。编译生成的字节码在不同的平台上是相同的,但是JVM翻译的机器码是不同的。

image-20230911171956765

二、JVM 的组成结构

JVM 由 类加载器、运行时数据区、执行引擎组成

image-20230911172211381

三、Java 代码执行流程

image-20230911172241642

四、JVM 的生命周期

JAVA程序的执行过程简单来说包括:

  1. JAVA源代码编译成字节码;
  2. 字节码校验并把JAVA程序通过类加载器加载到JVM内存中;
  3. 在加载到内存后针对每个类创建Class对象;
  4. 字节码指令和数据初始化到内存中;
  5. 找到main方法,并创建栈帧;
  6. 初始化程序计数器内部的值为main方法的内存地址;
  7. 程序计数器不断递增,逐条执行JAVA字节码指令,把指令执行过程的数据存放到操作数栈中(入栈),执行完成后从操作数栈取出后放到局部变量表中,遇到创建对象,则在堆内存中分配一段连续的空间存储对象,栈内存中的局部变量表存放指向堆内存的引用;遇到方法调用则再创建一个栈帧,压到当前栈帧的上面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM 虚拟机 ---> JVM 基础概念 的相关文章

  • 从 Intellij 在远程主机上部署/运行 jvm 应用程序

    是否可以在 intellij 的远程服务器上部署 运行 出于测试目的 独立的 Java 应用程序 我并不是要连接到已经运行的 JVM 而是要从 intellij 在远程主机上启动一个新的 JVM 就像它在我的本地计算机上运行一样 目前没有内
  • 将 JVM 字节码往返于文本表示的故障安全方法

    我正在寻找一种在 JVM 类文件和文本表示之间往返的故障安全方法 一项严格的要求是 只要文本表示形式保持不变 生成的往返 JVM 类文件在功能上与原始 JVM 类文件完全相同 此外 文本表示必须是人类可读和可编辑的 应该可以对文本表示进行小
  • 集群环境下的Spring Singleton

    正如中所讨论的this https stackoverflow com questions 1194129 singleton in cluster environmentpost 不适合使用单例聚集的环境 因为不同 JVM 中有多个单例对
  • 哪种语言(在 JVM 上运行)最适合创建 DSL?

    我们需要创建复杂的固定长度和可变长度字符串 这些字符串可能代表客户资料 订单等 你们建议使用哪种基于 JVM 的编程语言 想法是让最终用户使用此 DSL 创建字符串 所以我正在寻找验证 代码完成等 Groovy http docs code
  • 如何在JVM不退出的情况下多次运行Java程序?

    假设我有一个Java程序Test class 如果我使用下面的脚本 for i in 1 10 do java Test done JVM每次都会退出java Test被调用 我想要的是跑步java Test在不退出JVM的情况下多次执行
  • 使用 + 符号连接字符串

    今天我在读书Antonio 关于 toString 性能的博客 https antoniogoncalves org 2015 06 30 who cares about tostring performance 还有一段话 昨天曾经被认为
  • 热点 JVM 字节码解释器是跟踪 JIT 吗?

    这个问题几乎说明了一切 我一直在寻找答案 甚至通过 VM 规范 但我没有明确说明 No 不过 还有一些其他 JVM 具有跟踪 JIT HotPath http HotPath GoogleCode Com and Maxine http L
  • 非活动状态下的 Spring Boot 堆使用情况

    我在本地部署了一个非常简单的 spring boot 应用程序 它只有一个类 控制器 差不多就这样了 我注意到堆分配并不稳定 并且有峰值和突然下降 为什么会这样 我没有对应用程序进行过一次调用 A view from VisualVM 事实
  • 如何减少Scala中创建的对象数量?

    我正在 Scala 中编写一个计算机图形应用程序 它使用 RGB 类返回图像中某个点的颜色 正如你可以想象的 返回颜色 RGB 对象的函数被调用了很多次 class RGB val red Int val green Int val blu
  • Java 中的引用变量里面有什么?

    我们知道对象引用变量保存表示访问对象的方式的位 它不保存对象本身 但保存诸如指针或地址之类的东西 我正在阅读 Head First Java 第 2 版 一书 书中写道 第 3 章第 54 页 在 Java 中我们并不真正知道什么是 在引用
  • Oracle 的商业 Hotspot JVM 相对于 OpenJDK 有哪些性能优势?

    正如这个问题中所描述的 OpenJDK 与 Java HotspotVM https stackoverflow com q 44335605 1593077 Oracle 的商业 Hotspot JVM 本质上是 OpenJDK 加上一些
  • JVM 是否会内联对象的实例变量和方法?

    假设我有一个非常紧密的内部循环 每次迭代都会访问和改变一个簿记对象 该对象存储有关算法的一些简单数据 并具有用于操作它的简单逻辑 簿记对象是私有的和最终的 并且它的所有方法都是私有的 最终的和 inline 下面是一个示例 Scala 语法
  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • Java 语言中不可用的字节码功能

    当前 Java 6 是否有一些事情可以在 Java 字节码中完成而在 Java 语言中无法完成 我知道两者都是图灵完备的 所以将 可以做 理解为 可以做得更快 更好 或者只是以不同的方式 我正在考虑额外的字节码 例如invokedynami
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • JVM锯齿状空闲进程

    我目前正在进行一项涉及 JVM 及其内存使用工作原理的研究 我不明白的是 JVM在空闲时用什么填充它的内存 只是为了在堆几乎达到时释放它 为什么使用的内存不只有一条平线 顺便说一句 这个 java 应用程序托管在 glassfish 上 但
  • Java:为什么.class文件中的方法类型包含返回类型,而不仅仅是签名?

    class 文件的常量池中有一个 NameAndType 结构 它用于动态绑定 该类可以 导出 的所有方法都被描述为 签名 返回类型 喜欢 getVector Ljava util Vector 当某些 jar 中方法的返回类型发生更改时

随机推荐

  • (4层)TCP 首部字段

    TCP 报文段的首部格式 TCP 虽然是面向字节流的 但 TCP 发送的数据单元却是报文段 一个 TCP 报文段分为首部和数据两部分 而 TCP 的全部功能都体现在它首部中各字段的作用 TCP 报文段首部的前 20 个字节是固定的 后面有
  • 【搭建博客】picGo+OSS防盗链配置(不同平台)

    汝之观览 吾之幸也 本文主要讲解在使用picGo OSS使用时会出现防盗链问题 配置OSS的防盗链 OSS支持对存储空间 Bucket 设置防盗链 即通过对访问来源设置白名单的机制 避免OSS资源被其他人盗用 可参考防盗链 配置目录 登录O
  • java strom实例_storm 入门教程+简单实例

    写在前面 本篇博客主要介绍 storm 基本概念和一个简单实例 storm版本1 0 2 storm基本概念 storm的集群架构 storm 是一个主从架构 一个主节点 n个从节点 主节点和从节点之间通过zk集群来进行交互 这张图是盗的
  • win10 安装 Cygwin

    http preshing com 20141108 how to install the latest gcc on windows How to Install the Latest GCC on Windows Several mod
  • c++之文件操作

    文件操作 1 头文件fstream 2 文件类型有两种 文本文件 二进制文件 3 操作文件的三大类 ofstream 写操作 ifstream 读操作 fstream 读写操作 写文件 1 包含头文件 include
  • OpenSSL_add_all_digests 函数不是 thread-safe 的

    项目中 多个线程同时执行 OpenSSL add all digests 函数 crash了 backtrace 如下 0 0x00007f5e93f5d536 in lh insert from usr lib64 libcrypto s
  • OpenStack官方认证(COA)正式回归!

    Certified OpenStack Administrator 简称 COA 是OpenStack基金会在2016年推出的唯一一个OpenStack官方管理员技术认证 对OpenStack的日常使用和管理 应该学习和掌握哪些技术 提出了
  • tp5,php将数组转化为字符串

    al array为数组 al array new implode al array implode将把数组的元素用逗号分割 al array new为以逗号为分隔符的字符串 补充 字符串转数组 explode str 下面有个问题 带键值的
  • ES6 JS 关于字符串和数组之间的转换

    ES6 JS 关于字符串和数组之间的转换 ArrayBuffer转16进度字符串示例 function ab2hex buffer var hexArr Array prototype map call new Uint8Array buf
  • 协议数据单元PDU和服务数据单元SDU

    关注汽车工程师谈技术 一起学习技术 目录 1 协议数据单元PDU和服务数据单元SDU 2 AutoSAR中PDU和SDU的应用 3 总结 返回总目录 协议数据单元PDU 大家在AutoSAR开发过程中 特别是通信和诊断开发中 应该会经常碰到
  • 7-1 计算职工工资c语言,C语言职工工资管理系统

    一 设计需求说明 一 职工工资管理系统功能设计要求 1 输入记录 将每一个职工的姓名 ID号以及基本工资 职务工资 岗位津贴 医疗保险 公积金的数据作为一个记录 该软件能建立一个新的数据文件或给已建立好的数据文件增加记录 2 显示记录 根据
  • 在字符串中找出连续最长的数字串

    描述 题目描述 请一个在字符串中找出连续最长的数字串 并把这个串的长度返回 如果存在长度相同的连续数字串 返回最后一个连续数字串 注意 数字串只需要是数字组成的就可以 并不要求顺序 比如数字串 1234 的长度就小于数字串 1359055
  • 01.个人项目难点汇总3 箭头流动及油管流动特效

    01 简单实例
  • 电商常用的数据分析指标

    一 流量指标 浏览量PV 用户访问页面的总数 用户每访问一个网页就算一个浏览量 同一个页面刷新一次也算一个浏览量 访客数UV 一般以天为单位来统计24小时内的UV总数 一天内重复访问的只能算一次 实时在线人数 指15分钟内在线UV数 平均在
  • UI素材

    什么是UI组件 UI 设计组件 UI KIT 直译过来就是用户界面成套元件 是界面设计常用控件或元件 组 是设计元素的组合方式 件 由不同的元件组成 组件的优势 1 保证一致性 Consistency 与现实生活一致 与现实生活的流程 逻辑
  • 本期特别推荐

    本文阅读时间 13分钟 本文将为你介绍9种机器学习入门项目创意 更有微软ATP助力你的学习之路 在机器学习领域有什么好的项目可以实操吗 有哪些经典小项目可以推荐学习呢 以下的项目将帮助你更好了解机器学习 步入AI领域的大门 鸢尾花分类项目
  • SSRF——服务端请求伪造

    什么是SSRF 服务器端请求伪造 SSRF 是指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击 利用一个可发起网络请求的服务当作跳板来攻击其他服务 ssrf有什么作用 一般用于探测内网端口及信息 查看文件 甚至可
  • spring与mybatis三种整合方法

    1 采用MapperScannerConfigurer 它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean spring mybatis xml
  • vhd win10系统蓝屏问题(inaccessible boot device/0x000000c1)

    我的win10 是安装在vhdx虚拟磁盘中 在安装云桌面软件后 重启无法进入win10系统 出现蓝屏现象 具体的报错信息为 inaccessible boot device或 0x000000c1 问题根源 根源是云桌面软件为了接管系统的u
  • JVM 虚拟机 ---> JVM 基础概念

    文章目录 JVM 虚拟机 gt JVM 基础概念 一 Java 跨平台 主要原因 二 JVM 的组成结构 三 Java 代码执行流程 四 JVM 的生命周期 JVM 虚拟机 gt JVM 基础概念 一 Java 跨平台 Java是一种可跨平