JVM—编译器、类加载的过程、双亲委派机制这些你还记得吗?

news2024/11/28 7:55:29

背景介绍

这两天在对JVM的知识进行回顾,顺便来分享分享,接下来也会有系列文章,欢迎大家一起讨论。

过程

为什么叫JVM?

Java Virtual Machine,java虚拟机。可以理解成一个以字节码为机器指令的CPU

有哪些特点呢?

  • 不同的运行平台,有不同的虚拟机
  • 屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”

为什么JVM可以跨平台?

不同操作系统有不同的JVM,可以运行字节码文件。JVM只和class字节码文件有关系,任何语言只要能翻译成符合规范的class字节码文件,都能够被JVM运行

JDK、JRE、JVM三者关系

  • JDK:Java Development Kit(java开发者工具)
  • JRE:Java Runtime Environment(java运行时环境)
  • JVM:Java Virtual Machine(java虚拟机)

  • jdk包含了jre,还提供了程序所需要的工具(java和javac运行编译环境的,javadoc可以把java生成一篇文档,jar把程序打包成应用……),jdk提供了java开发的环境(需要这样一个平台你才能写java代码)。jdk包含了jre,在jre的基础上扩充了一些开发工具,让开发者可以使用
  • jre包含了jvm、函数库,jre运行时环境,只要安装了jre,就能运行java代码了
  • jvm虚拟机,可以当成一种规范,可以用软件实现,也可以用硬件实现,它相当于在所有的操作系统上模拟了一个小小的CPU去处理java相关的东西。实现了跨平台,jvm屏蔽了底层的一些差别,一次编译到处执行

JVM包含了哪些部分?

 注:这张图片引用自网上

接下来我针对JVM的每一部分起了哪些作用具体来说说吧!


一、编译器

为什么要用编译器?

我们在本地写的都是源代码,而电脑,也就是CPU只认识0和1,要想让电脑执行我们写的程序,就要翻译成电脑能够认识的语言0和1,这个翻译的过程就是编译器去做。


二、类加载子系统

类的加载过程(类的生命周期)

被javac编译之后的字节码文件是存在磁盘中的,而类加载的过程就是把字节码从磁盘加载到内存中的过程

 

1、加载(Loading):

作用:生成Class。类加载器通过类的全限定名在内存中成java.lang.Class类模板对象,作为方法区这个类的各种数据的访问入口

工作内容:

  • 将class信息,静态变量、常量加载到方法区
  • 将Class对象指向class信息

2、验证(Verify):

作用:确保Class文件是否符合当前虚拟机要求,保证被加载类的正确性,只有符合JVM字节码规范的才能被JVM正确执行

工作内容:

  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 符号引用验证

3、准备(Prepare):

作用:为成员变量分配内存并且设置该类变量的默认初始值,即零值

工作内容:

  • final不分配,在编译的时候就为final分配内存了,准备阶段会显式初始化
  • 不为实例变量分配初始化,类变量会分配在方法去中,实例变量会随着对象一起分配到Java堆中

4、解析(Resolve):

作用:将常量池内的符号引用转换为直接引用的过程

工作内容:

  • 类或接口、字段、类方法、接口方法、方法类型等

为什么要把符号引用转为直接引用?

在编译阶段java类并不知道所引用的实际地址,因此只能使用符号代替。比方说类A引用了类B,此时类A是不知道类B有没有被编译的,也不清楚类B的实际地址,所以用字符串S代表类B的地址,这个S就称为符号引用

  • 符号引用:可以理解为是一种占位符
  • 直接引用:可以理解为指向类、字段、方法存储在内存中的实际地址的指针

5、初始化:正常赋值,执行类构造器的过程
6、使用:执行main方法
7、卸载:销毁


类加载器

什么是类加载器?

负责加载类文件并生成对应的类对象的组件

类加载器的作用是什么?

类加载的时候是通过具体的类加载器去进行加载的,主要用于加载Class字节码文件

类加载器有哪几种分类?

  1. 引导类加载器(Bootstrap Class Loader):也称为根类加载器,是JVM的一部分,负责加载Java的核心类库,如rt.jar等。它是用本地代码实现的,不继承自java.lang.ClassLoader,因此无法直接获取到引导类加载器的引用。
  2. 扩展类加载器(Extension Class Loader):是由sun.misc.Launcher$ExtClassLoader实现的,负责加载Java的扩展类库,如jre/lib/ext目录下的jar包。它是Java类,继承自java.lang.ClassLoader。
  3. 应用程序类加载器(Application Class Loader):也称为系统类加载器,是由sun.misc.Launcher$AppClassLoader实现的,负责加载应用程序classpath下的类。它也是Java类,继承自java.lang.ClassLoader。
  4. 自定义类加载器(User Class Loader):用户通过继承java.lang.ClassLoader类的方法自行实现的类加载器

每个类加载器的区别是什么?

  • 加载的类目录不一样
  • 类的加载顺序不同
  • 可见性:类加载器可以根据需要通过父类加载器来委派加载类,但是父类加载器无法看到子类加载器加载的类

通过看底层的源码发现扩展类加载器和应用程序类加载器都是继承自ClassLoader类。而一个类只要继承了Classloader类,就是自定义类加载器

三个类加载器之间是什么关系?

层次关系,也称为双亲委派模型。每个类加载器之间互相配合、互相工作(类加载器都应该有自己的父类加载器,他们是组合关系去复用父类的代码)

什么是双亲委派模型(机制)?

当要加载一个类的时候会向上(父类)询问(委托)是否已加载过这个类,如果父类加载器无法加载该类,那么类加载器才会尝试自己加载

什么要使用双亲委派机制(好处)?
  • ①、避免类重复加载:提高类加载效率,保证数据安全

设想一个场景:用户在ClassPath中编写了一个java.lang.Object的同名类,如果没有双亲委派机制,每个类加载器都可以自行加载类,那么是不是会产生多个Object类呢?那程序使用的时候如何选择?唯一性就保证不了了

补充:全限定类名相同,并且类加载器是同一个,则会认为两个对象是同一个

  • ②、沙箱安全机制:保证核心.class不能被篡改

及时篡改也不会去加载,就算加载也不是同一个.class对象

总结

  • 在idea写的源码通过javac编译成机器认识的字节码文件
  • 字节码文件存储在磁盘中,想要到使用要通过类加载器把字节码文件加载到内存中
  • 类加载的需要通过双亲委派机制加载

升华

对于JVM的了解通过系统的回顾又有了新的发现,每次的反复都建立在原有的基础上不断精进,螺旋式上升引起量变到质变的过程

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

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

相关文章

python性能分析,logging性能,print性能,文件写入性能对比

先说结论,没想到的是print性能比logging性能好,输出到控制台会极大降低程序性能,以下是我的性能对比结果: 运行情况是python后台运行并输出到日志,命令是 python3 test.py > /opt/testtime.log 2>&1 &

【css】添加待小三角的提示框

如需创建在工具提示的指定侧面显示的箭头&#xff0c;在工具提示后添加“空的”内容&#xff0c;并使用伪元素类 ::after 和 content 属性。箭头本身是使用边框创建的。这会使工具提示看起来像气泡。 代码&#xff1a; <style> .tooltip {position: relative;display: …

通过signtool进行数字签名和验证签名

&#xff08;一&#xff09;如何签名 SignTool.exe (Sign Tool) - .NET Framework | Microsoft Learn Using SignTool to Sign a File - Win32 apps | Microsoft Learn 签名命令行&#xff1a; signtool.exe sign /f xxx.pfx /t http://timestamp.digicert.com yyy.dll xx…

C++ 学习系列 1 -- 左值、右值与万能引用

1. 何为左值&#xff1f;何为右值&#xff1f; 简单的说&#xff0c;左值可以放在等号的左边&#xff0c;右值可以放在等号的右边。 左值可以取地址&#xff0c;右值不能取地址。 1.1 左值举例&#xff1a; 变量、函数或数据成员返回左值引用的表达式 如 x、x 1、cout <…

Keystone Automotive EDI 需求分析

Keystone Automotive 是一家知名的汽车零部件销售卖场&#xff0c;自创立以来&#xff0c;在汽车行业取得了卓越的成就。作为一家专业的汽车零部件供应商&#xff0c;Keystone Automotive 致力于为客户提供优质的产品和卓越的服务。公司的经营范围涵盖广泛&#xff0c;涉及多个…

ubuntu python虚拟环境venv搭配systemd服务实战

文章目录 参考文章目录结构步骤安装venv查看python版本创建虚拟环境激活虚拟环境运行我们程序看缺少哪些依赖库&#xff0c;依次安装它们接下来我们配置python程序启动脚本&#xff0c;脚本中启动python程序前需先激活虚拟环境配置.service文件然后执行部署脚本&#xff0c;成功…

unity vscode 代码关联 跳转 BUG

一早打开电脑发现代码关联失效了&#xff0c;目测可能跟昨天一些插件更新有关 结论 就这货&#xff0c;开了就没法提示代码关联&#xff0c;估计预览版全是BUG。 另一个坑 同期有个unity插件也是预览版&#xff0c;“非常好使”&#xff0c;当场去世。评论点开有好几个人说用…

cadence virtuoso worning

cadence virtuoso 添加工艺库报错如下&#xff1a; Warning: ddUpdateLibList: It appears that you are trying to run an OA executable on CDB data. Library smic13mmrf_1233 contains file /home/IC/Tech/PDK_13mmrf_1P6M_30k/smic13mmrf_1233/prop.xx which is CDB data.…

Taro React组件使用(11) —— RuiNoticebar 公告栏

1. 需求分析 用于循环播放展示一组消息通知&#xff1b;通知消息渲染完成&#xff0c;获取消息的长度和盒子的长度&#xff1b;使用【taro react】---- 获取元素的位置和宽高等信息异步获取内容和盒子的宽高信息&#xff1b;通过 CSS3 的 animation 实现内容的移动&#xff1b…

Flume拦截器

实现 Interceptor接口 方法1 是初始化: 方法2和3重载 拦截: 方法3 是关闭: 但是flume是通过内部类创建对象的

一、Kubernetes介绍与集群架构

Kubernetes介绍与集群架构 一、认识容器编排工具 docker machine 主要用于准备docker host现已弃用建议使用docker desktop docker compose Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose&#xff0c;您可以使用 YAML 文件来配置应用程序的服务。…

c语言--浮点数(float)与0值比较

我们定义一个float类型的数据a&#xff0c;赋值为123456789并输出&#xff1a; int main() {float a;a 123456789;printf("%f\n",a);return 0; }输出结果为&#xff1a; 由此可以看出&#xff0c;程序输出的结果并不是其被赋予的值。即说明了浮点数存在一定的误差。…

MD-MTSP:星雀优化算法NOA求解多仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、星雀优化算法NOA 星雀优化算法(Nutcracker optimizer algorithm,NOA)由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模拟星雀的两种行为&#xff0c;即&#xff1a;在夏秋季节收集并储存食物&#xff0c;在春冬季节搜索食物的存储位置。星雀优化算法(Nutcrack…

Optional 使用方法详解

Optional的作用是什么&#xff1f;他都有哪些方法&#xff1f;阿里规范点名说尽量用Optional来避免空指针&#xff0c;那么什么场景用Optional&#xff1f;本篇文章围绕这三点来进行讲解。 一、Optional类的来源 到目前为止&#xff0c;臭名昭著的空指针异常是导致Java应用程…

Go For Web:踏入Web大门的第一步——Web 的工作方式

Web 的工作方式 了解当你访问一个网页时&#xff0c;背后是如何运作的&#xff0c;发生了一些什么&#xff1f; 其实当你输入网址&#xff08;URL&#xff09;并按下回车之后&#xff0c;你的浏览器相当于扮演了 客户端 的角色&#xff0c;首先你的浏览器会去请求 DNS 服务器进…

uniapp软键盘谈起遮住输入框和头部被顶起的问题解决

推荐&#xff1a; pages.json中配置如下可解决头部被顶起和表单被遮住的问题。 { "path": "pages/debug/protocol/tagWord", "style": { "app-plus": { "soft…

外呼系统是什么?有什么功能?AI智能系统人工系统

很多企业往往会选择通过使用外呼系统来解决封卡问题。与传统人工拨打相比&#xff0c;外呼系统一方面可以协助销售进行高效外呼&#xff0c;同时还能保障线路稳定不封号&#xff0c;与系统的接入也可以保证客户信息的跟进&#xff0c;助力销售持续性跟进。但是看到这里也不要误…

php通过各种函数判断0和空php实例

php通过各种函数判断0和空php实例 本文给大家介绍php同各种函数判断0和空的方法&#xff0c;在文章给大家补充介绍了php 语法里0不等于null为空的解决办法 补充&#xff1a;下面给大家介绍下php 语法里0不等于null为空的解决办法 今天遇到这样一个问题是这样的: php 语句里,我…

Allure2测试报告详解

目录&#xff1a; allure2安装allure2运行方式allure2报告生成allure2报告中添加用例标题allure2报告中添加用例步骤allure2报告中添加用例链接allure2报告中添加用例分类allure2报告中添加用例描述allure2报告中添加用例优先级allure2报告中添加用例支持tags标签allure2报告中…

冠达管理:A股继续缩量整理 创业板指数走势相对偏强

周三&#xff0c;A股低开后震动调整&#xff0c;三大指数均小幅跌落&#xff0c;创业板指相对偏强。到收盘&#xff0c;上证综指跌0.49%&#xff0c;报3244.49点&#xff1b;深证成指跌0.53%&#xff0c;报11039.45点&#xff1b;创业板指跌0.01%&#xff0c;报2228.73点。 资金…