首页 > 其他分享 >JVM类加载机制

JVM类加载机制

时间:2023-05-04 19:44:34浏览次数:44  
标签:JVM 虚拟机 Class 该类 机制 class 加载

1.类加载的生命周期

  类的加载过程包括:加载、验证、准备、解析、初始化

(解析某些情况下可以在初始化阶段后开始;

几个阶段按顺序开始,并非进行或完成,这些阶段通常是互相交叉混合进行。)

  类的加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

类的加载:将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个该类的Java.lang.Class对象,用来封装类在方法区类的对象。
加载类的时候,JVM必须完成三件事:

(1)通过类的全名,获取类的二进制数据流

(2)解析类的二进制数据流为方法区内的数据接口(java类模型)

(3)创建java.lang.Class类的实例,表示该类型。作为方法区这个类各种操作的入口

连接:

  验证:确保被加载类的正确性(为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全)

  准备:类变量分配内存并设置初始值(默认值)的阶段。(类变量被分配到方法区中,而实例变量存放在堆中)

  解析:把类中的符号引用(代号)转换为直接引用(直接指向目标)

初始化:为类的静态变量赋予初始值

使用:类访问方法区内的数据结构接口,对象是Heap区的数据(开发者可以在程序中调用类的静态方法、静态成员变量了)

卸载:结束生命周期

 

2.类加载器的层次

 

 

 

  Bootstrap ClassLoader 启动 类加载器:负责加载系统类(从rt.jar中进行加载),这个类加载器主要加载JVM自身工作需要的类。

  Extension ClassLoader 扩展:它负责加载JDK\jre\lib\ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。(sun.misc.Launcher$ExtClassLoader)

  Application ClassLoader 应用:它负责加载用户类路径上指定的类库,开发者可以直接使用这个类加载器。加载应用类,由CLASSPATH环境变量或者-classpath命令行选项设置的类路径中的目录里或者是JAR/ZIP文件里查找这些类。(sun.misc.Launcher$AppClassLoader)

  ExtClassLoader和AppClassLoader都是URLClassLoader的子类。

  自定义类加载器:

    在执行非置信代码之前,自动验证数字签名。

    动态地创建符合用户特定需要的定制化构建类。

    从特定的场所取得java class,例如数据库中和网络中。

 

3.Class.forName()和ClassLoader.loadClass()区别

  Class.forName():将类的.class文件加载到jvm中,会对类进行解释,执行类中的static块。

  它的作用就是按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。

 

  Class.forName(name, initialize, loader):带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象 。(第一种形式的参数 name表示的是类的全名;initialize表示是否初始化类;loader表示加载时使用的类加载器)

 

A a = (A)Class.forName("pacage.A").newInstance();     

A a = new A();

  ClassLoader.loadClass():只做一件事,将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会执行static块。

 

4.JVM有哪些类加载机制

  全盘负责:当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另有一个类加载器来载入。

  父类委托:先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。

  缓存机制:将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类后对应的二进制数据,并将其转换程Class对象,存入缓存区。(当你修改某个Java文件之后,不重启JVM的话,修改后的Java文件对应的Class文件并不在虚拟机中,所以是没法使用的。因此,想要使用修改后的Class文件,就要重启JVM。)

  双亲委派机制:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。

 

双亲委派机制过程?

  当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。

  当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。

  如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用ExtClassLoader来尝试加载;

  若ExtClassLoader也加载失败,则会使用AppClassLoader来加载,如果AppClassLoader也加载失败,则会报出异常ClassNotFoundException。

 

标签:JVM,虚拟机,Class,该类,机制,class,加载
From: https://www.cnblogs.com/cjhtxdy/p/17372278.html

相关文章

  • Arthas JVM 调优工具
    阿里巴巴开源的一个JVM调优工具——arthas(阿尔萨斯)。一、安装curl-Ohttps://alibaba.github.io/arthas/arthas-boot.jar如果下载速度太慢,可以用gitee上的源curl-Ohttps://arthas.gitee.io/arthas-boot.jar二、启动java-jararthas-boot.jararthas在启动时会......
  • 【SpringBoot】【一】 加载初始化器、监听器详解
    1 前言本节主要讲下SpringBoot启动的时候,加载初始化器、监听器的过程哈。2 加载时机我们先来看下加载的时机,也就是什么时候加载的呢,就是我们SpringBoot启动的时候,创建SpringApplication的时候就会去加载的,我们看下:@SpringBootApplicationpublicclassDemoApplicati......
  • jvm基础
     jvm中两个线程:1、守护线程:jvm自己使用的线程,比如垃圾回收(GC)就是一个守护线程2、普通线程:一般的java程序线程,只要JVM中有普通线程在执行,那么JVM就不会停止 结束生命周期在如下几种情况下,Java虚拟机将结束生命周期1、执行了System.exit()方法2、程序正常执行结......
  • 智能优化算法:类电磁机制算法 - 附代码
    智能优化算法:类电磁机制算法文章目录智能优化算法:类电磁机制算法1.算法原理1.1初始化1.2局部搜索1.3电荷量及力的计算1.4移动粒子2.算法结果3.参考文献4.Matlab摘要:2003年,Birbil和Fang由于受到电磁场带电粒子间的吸引-排斥机制的启示而提出了基于种群的一种新的随机启发......
  • matlab程序制定,综合能源系统优化调度,综合需求响应的应用,碳交易机制。
    matlab程序制定,综合能源系统优化调度,综合需求响应的应用,碳交易机制。ID:34100671575346700......
  • matlab复现,考虑综合需求响应和阶梯型碳交易机制的综合能源系统优化调度策略。
    matlab复现,考虑综合需求响应和阶梯型碳交易机制的综合能源系统优化调度策略。关键词,综合能源系统,碳交易机制,综合需求响应。matlab复现,考虑综合需求响应和阶梯型碳交易机制的综合能源系统优化调度策略。关键词,综合能源系统,碳交易机制,综合需求响应。ID:6589668591988550......
  • matlab程序设计,承接研究范围:综合能源系统优化调度,主从博弈,综合需求响应,碳交易机制,阶梯
    matlab程序设计,承接研究范围:综合能源系统优化调度,主从博弈,综合需求响应,碳交易机制,阶梯型碳交易机制,多时间尺度优化。ID:41100678701976813......
  • MATLAB代码:碳交易机制下考虑需求响应的综合能源系统优化运行 综合能源系统是实现“双
    MATLAB代码:碳交易机制下考虑需求响应的综合能源系统优化运行综合能源系统是实现“双碳”目标的有效途径,为进一步挖掘其需求侧可调节潜力对碳减排的作用,提出了一种碳交易机制下考虑需求响应的综合能源系统优化运行模型。首先,根据负荷响应特性将需求响应分为价格型和替代型2类,分......
  • SpringBoot项目部署在外置Tomcat正常启动,但项目没有被加载的问题
    最近打算部署个SpringBoot项目到外置Tomcat运行,但是发现tomcat启动成功,访问却一直404,刚开始以为是Tomcat的问题,就一直在改Tomcat配置。最后发现tomcat启动时根本就没加载到项目,因为控制台没有打印"SpringBoot"的项目标志经过一番百度查找,最后发现是因为项目启动类没有继承Spring......
  • 微服务 - Nginx网关 · 进程机制 · 限流熔断 · 性能优化 · 动态负载 · 高可用
    系列目录:微服务-概念·应用·通讯·授权·跨域·限流微服务-集群化·服务注册·健康检测·服务发现·负载均衡微服务-Redis缓存·数据结构·持久化·分布式·高并发本文的前提需要了解一些基础的Linux知识。以下围绕Nginx1.23的网关应......