JVM的类加载机制

2023-09-17 13:53:23

1、概述:JVM是Java语言实现跨平台的关键,Java语言的运行过程:

        *.java通过编译器编译为*.class,通用字节码文件并不能直接被操作系统所识别,针对不同的操作系统可安装对应的JVM,JVM将字节码解释为当前平台所能识别的机器码实现“跨平台”。

JVM执行class文件的方式:解释为主,编译为辅

解释:将字节码解释为操作系统能识别的机器码

编译:对于出现次数较多的“热点”指令直接编译为机器码存储在缓存中(JIT)

2、JVM的组成结构

JVM由类加载器、运行时数据区域、执行引擎、本地方法接口四部分组成

3、类加载过程

JVM要将字节码解释为机器码,首当其冲需要将字节码加载到JVM内存中,这个过程叫做类加载。

类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生命周期可以简单概括为 7 个阶段::加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)。其中,验证、准备和解析这三个阶段可以统称为连接(Linking)。

第一步:加载(三件事)

        一、根据完全限定名读取二进制字节流

        二、将字节流所代表的静态存储结构转换为方法区(元空间)的运行时数据结构

        三、生成类的 Class 对象,作为方法区各种数据的访问入口。

第二步:验证——验证字节码中字节流信息是否符合当前JVM要求,并不会危害JVM的自身安全

第三步:准备——为类变量分配内存并设置初始化值

第四步:解析——将常量池符合引用替换为直接引用

第五步:初始化——执行<clinit>(包含静态变量赋值与静态代码块)

        注意:定义在静态代码块之后的类变量,只能赋值,不能访问

经历上述5个步骤后,类已经被加载至JVM内存中。那么在什么情况下一个类会被加载呢? 

4、类加载时机

      触发类加载的常见场景有以下5种情况:

一、new一个对象、访问类变量、为类变量赋值、调用类方法(new、getstatic、putstatic、  invokestatic指令)

二、对类的反射调用(Class.forName()或newInstance()

三、预加载类的父类未加载时,先加载父类

四、程序入口方法所在类会加载

五、接口中定义了默认方法,在实现类加载前会先加载接口

注意:接口中虽无法定义静态代码块,但仍有静态变量的存在,与类不同的是,接口的类加载不会触发父接口的类加载,只有在使用到了父接口才会对父接口类加载,同样实现类也一样,未使用父接口中的资源时不加载父接口(定义了默认方法的接口例外)

        同样也有几种场景情况下不会进行类加载需要我们了解,以免混淆

一、通过子类引用访问父类的类变量,子类不加载

二、数组定义的引用类,不触发类加载,JVM会将数组类自动生成为Object的子类

三、常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的加载。

类加载的过程已经何时会进行类加载我们已经了解了,那么谁来执行类加载呢,它需要依靠一个叫类加载器的结构完成这一步骤,类加载器属于前面JVM组成接口的一部分。

5、类加载器——执行类加载

类加载器针对加载类不同分为3大类:

        一、启动类加载器(Bootstrap ClassLoader):加载基础、核心类库

        二、扩展类加载器(Extension ClassLoader):加载扩展类库,父类加载器为Bootstrap ClassLoader

        三、应用程序类加载器/系统类(Bootstrap ClassLoader):加载自定义类与第三方jar包类库,父类加载器为Extension ClassLoader

这三个类加载它们各司其职,但存在层次结构关系,类加载器之间的层次关系被称为双亲委派模型

双亲委派模型的工作原理类加载器首先会将类加载请求转发至父类加载器,若父类加载器完成不了时,它才会自行加载。

这样干究竟有什么目的?

例如:java.util.lang包下有一个Object类(存放在rt.jar【由启动类加载器加载】),我们同样自定义了一个java.util.lang包下的Object类放到 ClassPath 中(由应用程序类加载器加载)。由于rt.jar 中的 Object 优先级更高,那么程序中使用的所有的 Object 都是由启动类加载器所加载的Object。

作用:使得 Java 类随着它的类加载器一起具有一种带有优先级的层次关系,从而使得基础类得到统一,避免冲突

更多推荐

黑马JVM总结(十)

(1)直接内存_基本使用下面我们看一下使用了ByteBuffer直接内存,大文件的读写效率是非常的高Java本身并不具备磁盘读写的能力,它需要调用操作系统的函数,需要从java的方法内部调用本地方法操作系统的方法,设计到了cpu的用户状态变为内核态,切换到内核态以后,由cpu的函数去读取磁盘文件的内容,会在操作系统中划

【计算机网络】——数据链路层(应用:局域网、广域网、设备 )

//仅做个人复习和技术交流,图片取自王道考研,侵删一、大纲1、介质访问控制信道划分介质访问控制随机访问介质访问控制2、局域网3、广域网4、数据链路层设备二、局域网1、局域网基本概念和体系结构局域网(LocalAreaNetwork):简称LAN,是指在某一区域内由多台计算机互联成的计算机组,使用广播信道。特点1:覆盖的

【python】我用python写了一个可以批量查询文章质量分的小项目(纯python、flask+html、打包成exe文件)

web效果预览:文章目录一、API分析1.1质量分查询1.2文章url获取二、代码实现2.1Python2.11分步实现2.12一步完成2.13完整代码2.2python+html2.21在本地运行2.22打打包成exe文件2.23部署到服务器一、API分析1.1质量分查询先去质量查询地址:https://www.cs

Python垃圾回收机制详解:引用计数与循环垃圾收集器

文章目录Python垃圾回收机制引用计数机制循环垃圾收集器小结详细讲解及实操1.程序中的垃圾问题2.垃圾的定义3.自动垃圾回收机制4.示例:使用del方法删除垃圾对象5.手动处理垃圾回收6.结束程序7.垃圾回收的自动处理8.结束程序python精品专栏推荐python基础知识(0基础入门)python爬虫知识Pytho

MySQL与ES数据同步的四种方案及实践演示

文章目录一、同步双写优点缺点双写失败风险项目演示二、异步双写(MQ方式)优点缺点项目演示三、基于Datax同步核心组件架构图支持的数据源及操作项目演示四、基于Binlog实时同步实现原理优点缺点项目演示一、同步双写也就是同步调用,这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES。优点1.业务逻辑简单

14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到5月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%,这下搞的饭都吃不起了。还在有个朋友内推我去了一家互联网公司,兴冲冲见面试官,没想到一道题把我给问死了:如果模块请求http改为了h

每日练习-7

目录一、选择题二、算法题1、两种排序方法2、求最小公倍数一、选择题1、解析:指针和引用是C++中两种不同的变量类型,它们都可以用来访问或修改其他变量的值,但是它们有以下几个区别:引用必须在定义时初始化,而指针可以在任何时候初始化。例如,int&r=a;是合法的,但是int&r;是不合法的。而int*p;和int*p=&

02_elasticsearch 核心概念

02_elasticsearch核心概念1、lucene和elasticsearch的前世今生2、elasticsearch的核心概念1、lucene和elasticsearch的前世今生1、lucene和elasticsearch的前世今生lucene:最先进、功能最强大的搜索库。但是直接基于lucene开发,非常复

【Vue】模板语法,插值、指令、过滤器、计算属性及监听属性(内含面试题及毕设等实用案例)上篇

一、引言1、什么是模板语法?Vue的模板语法是一种用于在HTML中声明式地渲染Vue组件的语法。它基于HTML,并通过特定的模板语法扩展了HTML。Vue使用了一种称为“Mustache”语法的模板插值来绑定数据到HTML元素上。在Vue的模板语法中,你可以使用双大括号({{}})将数据绑定到HTML元素上,这样数据的

隔山打牛:金融大崩溃

当2004-2006年美联储主席格林斯潘在任期的末尾一鼓作气把联邦利率从1%拉高到5%,然后把美联储主席的位子交给继任者伯南克的时候,没有人意识到接下来将要发生何等巨变。图:美国联邦利率伯南克把利率稳定在5.3%附近的高位一年左右时间,直到2007年年中。美股从2003年底开始的牛市,一直狂飙到2007年底。标普500

【数据仓库设计基础1】关系数据模型理论与数据仓库Inmon方法论

文章目录一.关系数据模型中的结构1.关系2.属性3.属性域4.元组5.关系数据库6.关系表的属性7.关系数据模型中的键二.关系完整性1.空值(NULL)2.关系完整性规则3.业务规则4.关系数据库语言三.规范化四.关系数据模型与数据仓库关系模型被广泛应用于数据处理和数据存储,尤其是在数据库领域,现在主流的数据库管理系统

热文推荐