JVM虚拟机的组成

news2024/11/15 17:44:21

一、为什么要学习 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.coloradmin.cn/o/1861143.html

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

相关文章

IDS Gaia-X Catena-X Manufacturing-X的关系

来源:小盟科普丨Catena-X数据空间在汽车领域落地https://mp.weixin.qq.com/s/Ftp0UGAohsh4ltLn3DylAw

苹果电脑清理垃圾怎么清理 macbook怎么清理电脑垃圾文件 macos优化软件 cleanmymac怎么使用

在选择电脑时,不少人都会选择拥有高性能和轻薄机身的mac。一开始,它确实如我们所期待的那样健步如飞,然而,随着时间的流逝,有没有觉得您的Mac有时候像是需要一个好的春季大扫除一样?随着我们不断使用电脑&a…

IMU应用于颈部健康监测

随着电脑成为日常工作的必备工具,长时间使用电脑导致的颈部疼痛问题日益受到关注。近日,一项创新研究利用IMU开发了一种新型监测系统,用来监测电脑使用者的颈部姿势和疼痛情况。 在为期两天的实验中,8名办公室工作者分别在静态和…

2024年世界移动大会(MWC Shanghai)——飞睿智能诚邀您,超宽带技术定位测距传输全家桶

超宽带UWB芯片SIP系列: FS100 FS200 超宽带UWB标签系列: FU3620-2 FUP410-1 超宽带UWB应用系列: FMFB200A(门锁方案) FU2625-2(TAG方案) FPDB200A(音频) FSTB200…

中学政史地杂志中学政史地杂志社中学政史地编辑部2024年第4期目录

每月时政 时政要闻(2024年3月) 李伟; 3-4 热点聚焦 全面加强基础设施建设,积极扩大有效投资 刘华; 5-7《中学生政史地》投稿:cn7kantougao163.com 蒙古国努力应对冰雪灾害 张仁杰; 8-10 复习指导 高中政治经济全球化内容复习…

【SQL Server数据库】数据的增删改操作

目录 一、用SQL语句完成下列功能。 1、新开设一门课程,名叫网络安全与防火墙,学时40,编号为“0118”,主要介绍网络的安全与主要的防火墙软件。 2、先建立monitor表,其结构与student表大致一样.…

亚马逊运营专词(一)

许多新入驻亚马逊的大陆卖家,对亚马逊的专业词汇还不太了解,导致在运营店铺的过程出现一些问题,今天就来讲解一下亚马逊常用的运营专词,方便新手卖家深入了解。 1. Listing:亚马逊listing指的是产品的详情页面&#xf…

关于jd-gui启动报This program requires Java 1.8+的错误

问题: 在Mac使用上JD-GUI启动时,报了如下的错误: ERROR launching JD-GUINo suitable Java version found on your system! This program requires Java 1.8 Make sure you install the required Java version. 解决方法: 方法…

使用官方新工具手动升级 Quest 操作系统

Meta 近期推出了一款用于手动升级 Meta Quest 系统的工具,为用户提供了更多选择。本文将详细介绍如何使用这一工具进行系统升级。 优势与劣势 优势: 安装迅速:升级速度相比在线自动升级快,且可实时查看进度 即时升级&#xff1…

公关世界杂志社《公关世界》杂志社2024年第12期目录

公关动态 中国公共关系协会在法国巴黎举行黄河文化展 1-2 专题 以书法谈执法 高林; 3-4 乡村振兴与绿色发展 促进黑龙江省冰雪旅游产业高质量发展的支持政策研究 蔡德发;李可新; 5-7《公关世界》投稿:cnqikantg126.com 乡村振兴视域下青年社会责任感…

【快速入门】Transformer: Attention Is All You Need

Transformer → \to → 【知名应用】BERT (unsupervised trained Transformer) Transformer :seq2Seq model with self-attention, 后续会主要说明 self-attentionTransformer的组成: Self-attention是 Attention变体,擅长捕获数据/特征的内…

diffusion扩散模型参考论文与代码

十分钟读懂Diffusion:图解Diffusion扩散模型 - 知乎在之前的文章中,我们曾经介绍过Diffusion的具体原理,但是讲的还是比较偏理论,为了让大家快速了解Diffusion原理,这篇文章我们通过图解的方式。 绝密伏击:…

重点!业内分享:如何找到自己门店的生鲜经营定位

说到经营生鲜品类 许多商超人士或许都会面临这样一个困境 即品类繁多且复杂,那么如何做到精准施策? 比如说,蔬菜和水果虽都归为生鲜,然而细分起来,价格和消费群体均存在差异。像蔬菜,价格通常较低&#…

Redis集群-计算key的插槽值等命令

文章目录 1、集群方式登录主机63792、计算key应该保存在那个插槽3、计算某个插槽中保存的key的数量4、返回指定槽中的键5、查看redis的版本5.1、Redis集群的自动故障转移5.2、主节点下线,从节点自动升为主节点5.2.1、杀死主节点63795.2.2、登录从机6383,…

如何设计出比小米SU7 还酷炫的中控大屏?

最近,国内新能源汽车的热度是一波又一波,比亚迪大降价、小米SU7横空出世…… 智能驾舱,车载设计也受到越来越多人的关注。作为一名软件产品经理或设计师,你可能正在相关行业工作,或准备进入汽车领域。那你一定想了解车…

Android反编译之dex2jar和JD-GUI

文章目录 简述工具dex2jar目标dex文件操作 JD-GUI 简述 1.dex2jar是将dex文件转换为class文件的jar包; 2.JD-GUI是查看转化后的class对应的jar包; 工具 dex2jar 下载地址:https://github.com/pxb1988/dex2jar 点击红框中的Latest版本信息…

T-Reqs:一款基于语法的HTTP漏洞挖掘工具

关于T-Reqs T-Reqs全称为Two Requests,T-Reqs是一款基于语法的HTTP模糊测试漏洞挖掘工具,该工具可以通过发送版本为1.1或更早版本的变异HTTP请求来对目标HTTP服务器进行模糊测试以及漏洞挖掘。该工具主要通过下列三大步骤实现其功能:&#x…

kubernetes pod 最小可部署计算单元

1 工作负载(workloads) 工作负载(workload)是在kubernetes集群中运行的应用程序。无论你的工作负载是单一服务还是多个一同工作的服务构成,在kubernetes中都可以使用pod来运行它。 workloads分为pod与controllers p…

PointCloudLib 3D对象的可视化 C++版本

0.实现效果 显示箭头 vtkOutputWindow::SetGlobalWarningDisplay(0);pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(1, 1, 1);//添加箭头显示pcl::PointXYZ pA(0, 0, 0);pcl:…

Java高级重点知识点-12-Collection、iterator迭代器、泛型

文章目录 Collection集合Iterator迭代器泛型(难点) Collection集合 集合是java中提供的一种容器,可以用来存储多个数据。 集合框架 单列集合java.util.Collection双列集合java.util.Map 集合类继承体系图: List集合的特点&am…