jvm类加载机制一(代码片段)

ozho ozho     2022-12-02     781

关键词:

类加载的过程

什么是类加载?Java编译器会将我们编写好的代码编译成class字节码文件,JVM会把这些class字节码文件加载到内存中,并对加载的数据进行校验、准备、解析并初始化,这个过程就是类加载机制。类加载分为三个阶段:加载,连接,初始化。
技术图片

这三个阶段都是在程序运行期间完成的。其中加载,校验,准备,初始化,卸载的顺序都是确定的,解析可能会在初始化之后完成。
JVM 可以选择符号引用解析的时机,一种是当类文件加载并校验通过后,这种解析方式被称为饥饿方式。另外一种是符号引用在第一次使用的时候被解析,这种解析方式称为惰性方式。

1、加载

将字节码文件加载到内存中,并将这些静态数据转换成方法去中的运行书数据区,在堆中生成一个这个类的class对象,作为方法区数据的访问入口,这个过程需要类加载器的参与。
技术图片
加载的过程:
(1)通过一个类的全限定名(包名和类名)来获取此类的二进制字节流Class文件。获取的方式可以通过jar包,war包,网络中获取,Jsp生成等方式。
(2)将字节码中的静态存储结构转换为方法区中的运行时数据结构。例如将class文件常量池转换为运行时常量池
(3)在内存中生成这个类的java.lang.Class对象,作为方法区中的各种数据的访问入口。
加载完成之后,虚拟机外部的二进制字节流按照虚拟机的格式存储在方法区中。

2、连接

连接阶段负责将类中的二进制数据合并到JRE中,类的连接大致分为三个阶段:

验证:确保Class文件字节流中包含的信息符合虚拟机的要求。验证分为四个阶段的校验操作:

(1)文件格式验证:验证字节流是否符合Class文件格式的规范。
(2)元数据验证:对字节码描述的信息进行语义分析,来保证其描述的信息符合Java语言规范的要求。
(3)字节码验证:通过数据流和控制流分析确定程序语义是合法的。这个阶段对类的方法进行校验分析,保证被校验类不会做出危害虚拟机的行为。
(4)符号引用验证:虚拟机将符号引用转换为直接引用,这个动作发生在解析阶段中。主要的验证的操作:
a.符号引用中通过字符串描述的全限定名是否能找到对应的类。
b.载指定泪痕总共是否存在符合方法字段描述符以及简单名称描述的方法字段。
c.符号引用中的类,字段,方法的访问修饰符是否可以被当前类访问。

准备

准备阶段为类的静态变量在方法区中分配内存并赋默认值(0或者null)。
对于一般的成员变量在实例化时,随着对象一起在堆中分配内存。
对于静态常量在准备阶段赋自己设定的值,而静态变量是在初始化阶段完成的。

解析

解析阶段是虚拟机将虚拟引用转换为直接引用的过程。
符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任意形式的字面量,只要使用时能无歧义的定位到目标即可。引用的目标不一定已经到加载内存中,与内存布局无关。
直接引用:直接可以指向目标的指针,相对偏移量或者是一个能间接定位到目标的句柄。直接引用与内存布局相关。
主要分为:类或者接口的解析、字段的解析、类方法的解析、接口方法的解析,方法句柄,方法类型的解析。

3、类的初始化

类的初始化过程是执行类构造器方法的过程。
a、方法是由所有类变量的赋值操作和静态语句块组成的。

static int i=1;
static


b、方法对于类或者接口不是必需的,如果一个类没有静态变量或者静态语句块那么编译期可以部位这个类生成方法
c、父类的先于子类的方法执行,所以父类中定义的静态代码块要先于子类的静态代码块执行。所以可以得出以下执行顺序:
顺序:初始化父类的静态代码->初始化子类的静态代码->初始化父类非静态代码->初始化父类的构造函数->初始化子类的非静态代码->初始化子类的构造函数
注意:类构造器的与构造函数的不同。

类加载的时机

类的主动引用(一定会发生类的初始化
1、new一个类的对象
2、调用类的静态成员(除了final常量)和静态方法
3、使用java.lang.reflect包的方法对类进行反射调用
4、当虚拟机启动先启动main方法所在的主类
5、当初始化一个类,如果其父类没有被初始化,则先初始化它父类;接口不同的是不要求所有的父接口都初始化
类的被动引用(不会发生类的初始化)
6、当访问一个静态域时,只有真正声名这个域的类才会被初始化
7、通过子类引用父类的静态变量,不会导致子类初始化
8、通过数组定义类的引用,不会触发此类初始化
9、引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中

参考:《深入理解JVM虚拟机》

jvm类加载机制(代码片段)

文章目录一、类加载时机二、类加载过程2.1加载2.2验证2.3准备2.4解析2.5初始化三、类加载器3.1类与类加载器3.2双亲委派模型四、Tomcat类加载器架构原创不易,未经允许,请勿转载。博客主页:https://xiaojujiang.blog.csdn.net... 查看详情

jvm类加载机制(代码片段)

文章目录一、类加载时机二、类加载过程2.1加载2.2验证2.3准备2.4解析2.5初始化三、类加载器3.1类与类加载器3.2双亲委派模型四、Tomcat类加载器架构原创不易,未经允许,请勿转载。博客主页:https://xiaojujiang.blog.csdn.net... 查看详情

jvm----大白话图文之jvm类加载机制内存区域垃圾回收(代码片段)

JVM一、类加载机制1、JVM什么时候会加载一个类?2、验证、准备、解析、初始化过程2.1概念2.2什么时候初始化一个类?3、类加载器和双亲委派机制3.1类加载器3.2双亲委派机制3.3Tomcat类加载机制3.3.1破坏双亲委派二、内存区... 查看详情

tomcat类加载机制(代码片段)

1jvm类加载器1.1ClassLoader介绍Java的类加载,就是把字节码格式“.class”文件加载到JVM的方法区,并在JVM的堆区建立一个java.lang.Class对象的实例,用来封装Java类相关的数据和方法。JVM并不是在启动时就把所有的“.class”... 查看详情

tomcat类加载机制(代码片段)

1jvm类加载器1.1ClassLoader介绍Java的类加载,就是把字节码格式“.class”文件加载到JVM的方法区,并在JVM的堆区建立一个java.lang.Class对象的实例,用来封装Java类相关的数据和方法。JVM并不是在启动时就把所有的“.class”... 查看详情

jvm类加载器:双亲委派机制沙箱安全机制(代码片段)

·双亲委派机制、沙箱安全机制是JVM中类加载器系统的相关术语·在这之前,应该先了解JVM类加载器系统的相关概念一、类加载器基础知识    见下图1,java文件首先会被编译成class文件,class文件作为Java虚拟机的可... 查看详情

入门篇jvm类加载机制(代码片段)

类加载机制1.什么是类加载2.类加载的过程2.1加载2.2验证2.3准备2.4解析2.5初始化【重中之重之重中重】第一段代码:第二段代码:第三段代码:最后一段代码:总结1.什么是类加载首先你要知道一个类的从被加载到... 查看详情

jvm成神之路--类加载机制以及类加载器(代码片段)

...以加到我们的java技术交流QQ群。加作者请备注暗号[CSDN]类加载机制类加载机制本质上就是虚拟机把Class文件加载到 查看详情

jvm第六卷---类加载机制(代码片段)

JVM第六卷---类加载机制类加载机制加载链接验证准备解析初始化----<cinit>()V方法发生的时机练习类加载器启动类加载器扩展类加载器双亲委派模式线程上下文类加载器自定义类加载器破坏双亲委派模型的几种做法类加载机制J... 查看详情

jvm之类加载机制(代码片段)

JVM之类加载机制JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。 类加载五部分加载加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang... 查看详情

java类加载机制简介---jvm(代码片段)

文章目录类加载器介绍类加载器种类类加载机制双亲委派机制含义全盘负责委托机制含义注类加载器介绍类加载器种类启动类加载器(也叫引导类加载器。Bootstrap):这个类加载器负责放在<JAVA_HOME>\\lib目录中的&#... 查看详情

jvm--类加载器;双亲委派机制;线程上下文类加载器(代码片段)

一、类加载器类加载器就是根据类的二进制名(binaryname)读取java编译器编译好的字节码文件(.class文件),并且转化生成一个java.lang.Class类的一个实例。每个实例用来表示一个Java类,jvm就是用这些实例来... 查看详情

jvm--类加载器;双亲委派机制;线程上下文类加载器(代码片段)

一、类加载器类加载器就是根据类的二进制名(binaryname)读取java编译器编译好的字节码文件(.class文件),并且转化生成一个java.lang.Class类的一个实例。每个实例用来表示一个Java类,jvm就是用这些实例来... 查看详情

jvm的类加载机制(代码片段)

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 类加载的规则:全盘负责,当一个类加载器负责加载某个Class... 查看详情

从源码透彻理解jvm类加载机制(代码片段)

本文我们深入分析一下类加载机制的原理,然后从源码角度看一下加载的过程。目录1类加载器分类初探2三种类加载器介绍3从源码角度分析加载过程3.1创建扩展类加载器3.2构造应用类加载器1类加载器分类初探JVM严格来讲支持... 查看详情

jvm类加载机制详解(代码片段)

如下图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。加载加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法... 查看详情

《深入理解jvm——虚拟机类加载机制》(代码片段)

JVM深入理解JVM(5)——虚拟机类加载机制 PostedbyCrowonAugust21,2017在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用。而虚拟机中,而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟... 查看详情

jvm类加载机制(代码片段)

Java的程序要运行需要将编译好的class文件加载到JVM运行时数据区。在了解类的加载机制之前,我们需要了解一下类的生命周期。Java类从被加载到JVM内存开始,到卸载出内存为止,它的整个生命周期包括了:加载(Loading),验证... 查看详情