JVM 基本组成

一、为什么要学习 JVM ?

1. “ ⾯试造⽕箭,⼯作拧螺丝” , JVM 属于⾯试官特别喜欢提问的知识点;

2. 未来在⼯作场景中,也许你会遇到以下场景:

  • 线上系统突然宕机,系统⽆法访问,甚⾄直接OOM
  • 线上系统响应速度太慢,优化系统性能过程中发现 CPU占用过高,原因也许是因为 JVM GC 次数过于频繁;
  • 新项⽬上线,需要设置 JVM 的各种参数;

二、JDK\JRE\JVM

  • JDK:全称“Java Development Kit ” Java 开发⼯具包,提供 javac 编译器、 jconsole,jheap 等监控⼯具;
  • JRE:全称“ Java Runtime Environment ” Java 运⾏环境,提供 Class Library 核心类库+JVM;
  • JVM:全称“ Java Virtual Machine ” Java 虚拟机,⽤于运⾏ Java 应⽤程序; 

三、Java程序执⾏过程

  1. 编译:通过 件。 javac 命令,调⽤ JDK 编译器,将
  2. 执⾏:通过 *.java 源⽂件编译成 *.class 字节码⽂ java 命令,调⽤ JVM 虚拟机,执⾏ *.class 字节码⽂件。

四、Java程序的跨平台 

计算机平台是什么?       

        我们通常把 CPU 处理器与操作系统构成的系统架构,称为计算机平台。

        现代的电⼦计算机是基于⼆进制设计实现,所以 CPU 仅能识别 0 与 1 这样的⼆进制信号。⽽ 计算机程序的本质就是 0 与 1 之间的不同组合产⽣的机器指令,交给 CPU 去执⾏。CPU为了能识 别执⾏机器指令,就需要不同 CPU 架构和指令集来⽀持。不同的⼚商,设计⽣产 的 CPU , CPU 架构和指令集也是不同的。

        常⻅的指令集主要分为:精简指令集( RISC )和复杂指令集( CISC )。

  • 复杂指令集( CISC ): X86 和 X64 两种 CPU 架构基于 CISC 复杂指令集,⽐如: Intel 、 AMD 等⼚商的 CPU 。
  • 精简指令集( RISC ): ARM 架构的CPU基于 RISC 精简指令集,⽐如: Compaq 的 Alpha 、 HP 的 PA-RISC 、 IBM 的 Power PC 、 Apple 的 M1 。 在底层硬件及指令集之上,需要搭载不同的操作系统,⽤于⽀持不同的 CPU 指令集。

        例如:早 期的 MacOS 操作系统只⽀持 Power 系列的 CPU 。最新的 MacOS 系统只能安装在 M1 芯⽚的 CPU 。

        Java 是⼀种跨平台的编程语⾔,主要是为了让相同的 Java 应⽤程序代码,不⽤做任何修 改,可以在不同计算机系统平台上正常运⾏,兼容各种主流操作系统+ CPU 指令集。


跨平台的原因

实现跨平台的原因,主要有两个

  1. 不同的平台,相同的源代码,编译的字节码是相同的,所以字节码⽂件可以在不同平台“ 通⽤” ;
  2. 不同的平台,执⾏字节码时,都需要各⾃的 JVM 虚拟机版本,⽤于将字节码翻译成当前平台可 以执⾏的机器码指令;

五、静态编译器

通过 JDK 提供的静态编译器,将Java 源⽂件编译成字节码⽂件。

编译过程包括:

  1. 词法分析:通过空格分隔出源代码中的单词、操作符、控制符等信息,将其形成 流,传递给语法解析器。
  2. 语法分析:将 token 信息流按照 Java 语法规则,组装成⼀颗语法树
  3. 语义分析:对语法树进⾏关键字使⽤、类型匹配、作⽤域等语法检查。
  4. 字节码:当语义分析完成后,可以⽣成字节码

六、字节码

        当1个 Java 源文件被编译后,就会按照 JVM 规范和字节码定义,产生 1个 class 字节
码文件,文件内容由 10 个固定部分组成。

        前 4 个字节非常特殊,红色框的 cafe babe 是詹姆斯定义的魔法数,它的作用是标志当前文件是一个字节码文件。当 JVM 在进行类加载的 Load 阶段时,如果没有识别到该标志,就说明文件不是字节码文件或已损坏,则无法进行加载。绿色框代表当前版本号,0x34 的十进制为 52 ,是JDK8 的内部版本号,代表这个字节码文件基于 JDK8 编译。
        剩余部分中的每个字节均代表一个字节码指令,由于每个指令的长度按照 1 个字节存储,所以每个指令被称为字节码(Bytecode ),Java 所有的字节码指令有 200 多个。


        由于纯数字的字节码指令阅读⽐较困难,所以 JVM 在字节码指令的基础上设计了⼀套操作码助 记符,使⽤特殊单词来代替对应的数字指令。

例如:

  • 0x15 ILOAD :读取 int 类型的局部变量
  • 0x36 ISTORE :保存int类型的局部变量
  • 0x60 IADD :执⾏两个 int 类型的数值加法运算
  • 0xbb NEW :创建对象
  • 0xbc NEWARRAY :创建数组
  • 0xac IRETURN :返回 int 类型结果

七、JVM执⾏⽅式

JVM执⾏⽅式

JVM 以解释+编译混合模式,执⾏字节码⽂件。

  1. JVM 的执⾏⽅式以解释执⾏为主。执⾏过程中, JVM 将每个字节码⽂件中的每个指令,通过 解释器转换成当前平台可以识别的机器码,然后交给CPU 执⾏。
  2. 为了提⾼执⾏效率, JVM 还会在运⾏期间, JVM 通过热点代码的统计分析,识别⾼频的⽅法 调⽤,循环体、公共模块等,当超过阈值时, JVM 会基于 JIT 即时编译器( me compiler )将热点代码转换成机器码,直接交给 just-in-ti CPU 执⾏,提⾼执⾏效率。

a. Client 模式下默认阈值是 1500 次, Server 模式下是 10000 次。

  • ● JVM 解释器:程序执⾏的时候,解释器⾸先发挥作⽤,省去了编译器编译时间,加快程序的执 ⾏效率。
  • ● JIT 编译器:在程序运⾏过程中,随着时间的推移, JIT 开始慢慢发挥了作⽤,把热点代码 编译成本地代码后,以后执⾏相同的代码,即可直接交给 CPU 执⾏,带来更⾼的执⾏效率。

        机器在热机状态可以承受的负载要⼤于冷机状态(刚启动时 ),如果以热机状态时的流量进⾏切 换,可能使处于冷机状态的服务器因⽆法承载流量⽽假死。所以,在⽣产环境中发布应⽤,应该以分 批的⽅进⾏发布,根据机器数量划分成多个批次,每个批次的机器数⼤概占到整个集群的 15% 。

        故障案例:某应⽤在线发布新版本,采⽤进⾏分批发布,发布总批数误填写成分为两批发布。如 果是热机状态,正常情况下,集群中的⼀半的机器可以勉强⽀撑负载流量,但由于刚启动的 JVM 均 是解释执⾏,还没有进⾏热点代码统计和JIT动态编译,导致机器启动之后,当前 1/2 发布成功的 服务器⻢上全部宕机。

八、类加载器 

        字节码必须通过类加载器,通过加载、验证、解析等校验步骤,将字节码⽂件中的类,加载⾄ JVM 的中运⾏时数据区,才可以执⾏字节码。

类加载器的加载过程

当一个类被使用的时候,才会加载到内存中,类加载的过程有:加载、验证、准备、解析、初始化。其中中间三步合并称为链接。

  • - 加载:通过包名+类名,获取这个类,准备用流进行传输,将这个类加载到内存中,并创建一个class对象
  • - 验证:验证class文件中的信息是否符合虚拟机规范,有没有安全隐患
  • - 准备:负责为类的类变量(static修饰的变量)分配内存,并设置默认的初始化值
  • - 解析:将类的二级制数据流中的符号引用替换为直接引用。(本类中如果用到了其他类,此时就需要找到对应的类)
  • - 初始化:静态变量赋值以及初始化其他资源

九、垃圾收集器

        JVM 在运⾏期间,通过 Garbage Collctor 垃圾收集器,定期对运⾏时数据区进⾏垃圾对 象的回收,从⽽实现了内存⾃动管理。

十、JVM组成结构

        JVM 由类加载器、运⾏时数据区、 JVM 解释器、 JIT 即时编译器、垃圾回收器、本地⽅法库等部分组成。

        由类加载器完成字节码⽂件的加载验证和解析,存储⾄运⾏时数据区,并由执⾏引擎中的解释 器,完成字节码到机器码的解释执⾏。同时进⾏热点代码的统计分析,调⽤ JIT 即时编译器将字节 码直接编译成机器码,提⾼执⾏效率。JVM运⾏期间的⽅法调、数据对象统⼀存放⾄运⾏时数据区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/29766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在向量数据库中存储多模态数据,通过文字搜索图片

在向量数据中存储多模态数据,通过文字搜索图片,Chroma 支持文字和图片,通过 OpenClip 模型对文字以及图片做 Embedding。本文通过 Chroma 实现一个文字搜索图片的功能。 OpenClip CLIP(Contrastive Language-Image Pretraining&…

Ps:脚本与动作

有三种脚本语言可用于编写 Photoshop 脚本:AppleScript(macOS)、JavaScript 和 VBScript(Windows)。 Photoshop 脚本文件默认文件夹 Win:C:\Program Files\Adobe\Adobe Photoshop 2024\Presets\Scripts Mac…

代码随想录-Day35

134. 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定两个整数数组 …

Java阻塞队列:DelayQueue

Java阻塞队列:DelayQueue 在Java的并发编程中,阻塞队列是一种非常有用的数据结构,它不仅提供了线程安全的队列操作,还在必要时会自动阻塞获取操作,直到队列变得不为空。本文将重点介绍一种特殊的阻塞队列——DelayQue…

递归与回溯 || 排列问题

目录 前言: 全排列 题解: 全排列 II 题解: 子集 题解: 组合 题解: 组合总和 题解: 电话号码的字母组合 题解: 字母大小写全排列 题解: 优美的排列 题解:…

AI虚拟数字人上线需要办理哪些资质?

近年来,随着AI 技术快速发展,虚拟数字人行业也进入了新的发展阶段。AI 技术可覆盖虚拟数字人的建模、视频生成、驱动等全流程,一方面使虚拟数字人的制作成本降低、制作周期缩短,另一方面,多模态 AI 技术使得虚拟数字人…

[面试题]缓存

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis 什么是缓存?…

KVM虚拟化基础

虚拟化基础与分类 x86 CPU特权级别设为四个Ring:Kernel Mode运行在Ring 0、User Mode运行在Ring 3; 非硬件辅助虚拟化(一型) Hypervisor运行在Ring 0; Guest OS不做修改,以为自己运行在Ring 0上&#xff0…

OpenAPI Typescript Codegen 的基本使用

下载 axios npm install axios OpenAPI Typescript Codegen 官网:https://github.com/ferdikoomen/openapi-typescript-codegen 安装 OpenAPI Typescript Codegen npm install openapi-typescript-codegen --save-dev–input:指定接口文档的路径、url …

小程序餐饮点餐系统,扫码下单点菜,消费端+配送端+收银端+理端

目录 前言: 一、小程序功能有哪些 前端: 管理端: 二、实体店做小程序的好处 方便快捷的点餐和支付体验: 扩大店铺的曝光度和影响力: 优化顾客体验和服务质量: 降低成本和提高效率: 数据…

【学习】程序员资源网址

1 书栈网 简介:书栈网是程序员互联网IT开源编程书籍、资源免费阅读的网站,在书栈网你可以找到很多书籍、笔记资源。在这里,你可以根据热门收藏和阅读查看大家都在看什么,也可以根据技术栈分类找到对应模块的编程资源,…

Microsoft Visual C++ Redistributable 【安装包】【高速下载】

方法1、可以从官方下载,如下图 Visual C Redistributable for Visual Studio 2015 但是此链接只有一个版本 方法2 已经下载好并且已经整理好了2008--2022的所有版本点击下方链接即可高速下载 如果是win7-win8-win10-win11直接可以下载2015--2022版本&#xff0c…

大模型基础知识:探索人工智能的巨轮

人工智能大模型,这个在近年来频繁出现在科技新闻和学术论坛的热门词汇,已经成为了推动人工智能技术发展的关键力量。这些大模型,如OpenAI的GPT-3、谷歌的BERT、百度的ERNIE等,以其强大的性能和广泛的应用范围,引起了广…

【AI大模型】在健康睡眠监测中的深度融合与实践案例

文章目录 1. 应用方案2. 技术实现2.1 数据采集与预处理2.2 构建与训练模型2.3 个性化建议生成 3. 优化策略4. 应用示例:多模态数据融合与实时监测4.1 数据采集4.2 实时监测与反馈 5. 深入分析模型选择和优化5.1 LSTM模型的优势和优化策略5.2 CNN模型的优势和优化策略…

若依RuoYi-Vue分离版—配置多数据源

若依RuoYi-Vue分离版—配置多数据源 一、修改application-druid.yml二、修改pom文件,引入依赖第一种:下载jar包到本地,然后引入(我这边用的是这种)本地引入的,打包时需要加上配置 第二种:从远程…

随想录Day63 | 单调栈 42. 接雨水 84.柱状图中最大的矩形

随想录Day63 | 单调栈 42. 接雨水 84.柱状图中最大的矩形 42. 接雨水 题目链接 42 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 第一次提交 class Solution { public:int trap(vector<int>…

云原生微服务开发日趋成熟:有效拥抱左移以改善交付

在软件工程和应用程序开发方面&#xff0c;云原生已经成为许多团队的常用术语。当人们调查云原生的世界时&#xff0c;他们经常会得出这样的观点&#xff1a;云原生的整个过程都是针对大型企业应用程序的。几年前&#xff0c;情况可能确实如此&#xff0c;但随着 Kubernetes 等…

《Fundamentals of Power Electronics》——理想变压器基本公式推导

接下去推导理想变压器的基本公式。理想变压器满足以下三个条件&#xff1a; 1、无铜损。假设原副边线圈均无纯电阻&#xff0c;则不会因在铜导线中产生焦耳热引起能量损耗&#xff0c;另外也不考虑回路中的分布电容。 2、无铁损。忽略通过铁芯的磁通量变化引起的涡流损耗&…

线性二次型调节器(LQR)举例

线性二次型调节器(LQR) 线性二次型调节器(LQR)是一种用于最优控制的问题,其中目标是通过最小化某个代价函数来找到最优控制策略。LQR特别适用于线性系统。为了在人形机器人上应用LQR进行建模,主要步骤包括建立系统模型、定义代价函数以及求解最优控制律。以下是详细步骤…

Chromium 开发指南2024 Mac篇-Xcode安装(二)

1.引言 在开始编译和开发 Chromium 之前&#xff0c;确保开发环境的正确配置是至关重要的。对于 Mac 用户来说&#xff0c;Xcode 是不可或缺的工具&#xff0c;因为它不仅提供了必需的编译器和工具链&#xff0c;还包含了与 macOS 系统深度整合的开发资源。在本系列指南的第一…