首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏shysh95

    Java加载-加载

    这就是虚拟机的加载加载概念 ? 上图是加载和卸载的整个过程示意图,其中验证、准备、解析统称为连接阶段。 加载-加载阶段 加载加载的第一个阶段,加载阶段的主要目标是: 通过一个的全限定名来获取定义此类的二进制字节流 将字节流的静态信息结构转换为方法区(元数据区)的运行时数据结构 在内存中生成一个代表这个的 非数组加载需要通过加载器实现,既可以使用系统的提供的引导加载,也可以使用用户自定义的加载器去完成,关于加载器后续我会单独写一篇文章来介绍,并且实现我们自己的一个加载器。 对于数组来说,数组是由Java虚拟机直接创建的,但是数组中的元素类型需要通过加载加载。数组的可见性与数组中元素的可见性一致,如果元素不是引用类型,数组的可见性将默认为public。 本期加载加载阶段就介绍到这,下期我们会讲解加载的连接阶段,我们下期再见!!!

    1.8K40发布于 2021-02-25
  • 来自专栏DDD

    加载

    加载器并不需要等到某个被"首次主动使用"时再加载它,JVM规范规定JVM可以预测加载某一个,如果这个出错,但是应用程序没有调用这个, JVM也不会报错;如果调用这个的话,JVM才会报错,(LinkAgeError 加载机制 全盘负责,当一个加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个加载器来载入 双亲委托,先让父加载器试图加载该类, ,每一个层次的加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动加载器中,只有当父加载器反馈自己无法完成加载请求(它管理的范围之中没有这个)时,子加载器才会尝试着自己去加载 ? 当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个,而是把加载请求委派给父加载器ExtClassLoader去完成。 自定义加载器 既然JVM已经提供了默认的加载器,为什么还要定义自已的加载器呢?

    77430发布于 2021-03-23
  • 来自专栏韩曙亮的移动开发专栏

    【Android 逆向】加载器 ClassLoader ( 启动加载器 | 扩展加载器 | 应用加载器 | 加载的双亲委托机制 )

    文章目录 一、加载器 二、加载的双亲委托机制 一、加载器 ---- Java 虚拟机 ClassLoader 加载器 : Bootstrap ClassLoader : 启动加载器 , 该 加载器由 ; 加载的双亲委托机制 : 加载器 ClassLoader 接收到 加载任务 之后 , 自己不会先进行加载 , 反而将该 加载任务 委托 给 父加载器 执行 ; 父加载器 接收 到 该 加载任务 之后 , 也会 委托 父的父 加载器 执行 ; 委托操作 , 会一直传递到 最顶层的 启动加载器 Bootstrap ClassLoader ; 如果 启动加载器 Bootstrap ClassLoader 完成了 加载 操作 , 返回加载 ; 如果 启动加载器 Bootstrap ClassLoader 无法完成 加载 操作 , 就会 将 加载任务 委托给 子类完成 ; 同理 , 父 委托 给子类的 加载任务 , 如果 子类加载器 可以完成加载 , 成功返回 , 如果子类加载器无法完成加载 , 就再次 将 加载任务 委托给 子类的子类 , 继续向下传递 ;

    1.4K30编辑于 2023-03-30
  • 来自专栏FREE SOLO

    加载

    加载器种类 启动加载器,Bootstrap ClassLoader,加载JACA_HOME\lib,或者被-Xbootclasspath参数限定的 扩展加载器,Extension ClassLoader ,加载\lib\ext,或者被java.ext.dirs系统变量指定的 应用程序加载器,Application ClassLoader,加载ClassPath中的库 自定义加载器,通过继承ClassLoader 实现,一般是加载我们的自定义 双亲委派模型 加载器 Java 如同其它的 Java 一样,也是要由加载器来加载的;除了启动加载器,每个都有其父加载器(父子关系由组合(不是继承)来实现); 所谓双亲委派是指每次收到加载请求时,先将请求委派给父加载器完成(所有加载请求最终会委派到顶层的Bootstrap ClassLoader加载器中),如果父加载器无法完成这个加载(该加载器的搜索范围中没有找到对应的 双亲委派好处 避免同一个被多次加载; 每个加载器只能加载自己范围内的加载过程 加载分为三个步骤:加载,连接,初始化; ?

    61000发布于 2019-04-18
  • 来自专栏吉林乌拉

    加载

    也就是class文件被加载到虚拟机内存开始,到卸载出内存为止。它将要执行以下7个步骤: 加载 验证 准备 解析 初始化 使用 卸载 ? 下面我们看一下每一个阶段的详细流程。 加载 加载也就是把class文件加载到虚拟机内存中。在加载时虚拟机需要完成3个方面的工作: 通过一个的全限定名来获取的二进制字节流。 将字节流所代表的静态存储结构转化为方法区中的运行时数据结构。 在内存中生成一个代表这个的java.lang.Class对象。 字节码验证:这个阶段是最复杂的也是最耗时的验证,它主要目的是对的方法体进行验证,校验中的方法在运行时,不会做出威胁虚拟机的安全事件。 在解析时主要分为下面的几种: 或接口的解析 字段解析 方法解析 接口方法解析 初始化 初始化阶段主要的目的是为静态变量或者静态代码块执行赋值的操作。

    66930发布于 2019-08-14
  • 来自专栏Java面试

    加载器 超详解:什么是加载器,加载器作用及应用场景,加载时机,加载的完整过程,加载器分类

    文章目录一、什么是加载器、加载器作用1.1 定义与作用1.2 应用场景二、加载时机三、加载的完整过程3.1 加载3.2 验证3.3 准备3.4 解析3.5 初始化3.6 使用3.7 小节四、加载的分类 【理解】4.1 概述4.2 JDK8及之前的版本4.2.1 启动加载器4.2.2 扩展加载器和应用程序加载器扩展加载器应用程序加载器4.3 JDK9之后的加载器4.4 ClassLoader ,说明自己拓展的Jar包被加载了应用场景:在企业中开发一些偏底层的基础,所有用到jdk的项目都需要使用这些基础,此时就通过启动加载器去加载用户jar包4.2.2 扩展加载器和应用程序加载器扩展加载器和应用程序加载器都是 避免了核心被应用程序重写并覆盖的问题,提升了安全性)加载某一个,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载器尝试加载该类应用程序加载器的父加载器是扩展加载器 ,扩展加载器的父加载器是启动加载器。

    1.2K21编辑于 2024-09-18
  • 来自专栏java学习java

    加载器与加载过程

    加载器子系统作用 加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 加载信息存放于一块称为方法区的内存空间。 除了的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射) 加载器ClasLoader角色 class file存在于本地硬盘上 加载过程 public class HelloLoader { public static void main(String[] args) { System.out.println 由于Java采用的是懒加载策略,只有当我们需要用到这个的时候才会去加载他  初始化阶段就是执行构造器方法<clinit>()的过程。

    69030编辑于 2023-10-15
  • 来自专栏全栈程序员必看

    jvm怎么加载_jvm加载

    为什么要自定义加载器 原因: 1、存放在自定义路径上的,需要通过自定义加载器去加载。 【注意:AppClassLoader加载classpath下的】 2、不一定从文件中加载,也可能从网络中的流中加载,这就需要自定义加载器去实现加密解密。 3、可以定义的实现机制,实现的热部署, 如OSGi中的bundle模块就是通过实现自己的ClassLoader实现的, 如tomcat实现的自定义加载模型。 方法来加载,获取class对象。 一直提交给启动加载器去加载,通过他加载加载到的永远是/lib下面的java.lang.String 3、在这个自己写的中写上main方法 public static void main(String

    80410编辑于 2022-10-29
  • 来自专栏博文视点Broadview

    加载与 Java主加载机制解析

    以上便是一个Java加载的核心流程。了解了加载的核心流程之后,也许聪明的你会忍不住想,Java加载到底何时才会被触发呢? Java主加载由JVM自动触发——JVM执行完自身的若干初始化逻辑之后,第一个加载的便是Java程序的主。总体上而言,Java主加载的链路如下: ? Java程序主加载器默认是系统加载器,该加载器是JDK库中定义的sun.misc.AppClassLoader,关于该加载器的细节会在后文详述。JVM体系中加载器的继承关系如下图所示。 ? (String)接口的入参,系统加载器据此加载目标Java。 AppClassLoader的父加载器是ExtClassLoader,这是扩展加载器,用于加载JDK中指定路径下的扩展,这种加载器不会加载Java应用程序的主,所以程序流会进入if(this.parent

    1.2K10发布于 2020-06-11
  • 来自专栏韩曙亮的移动开发专栏

    【Android 逆向】加载器 ClassLoader ( 加载时机 | 隐式加载 | 显示加载 | 加载步骤 | 装载 | 链接 | 初始化 )

    文章目录 一、加载时机 1、隐式加载 2、显式加载 二、加载步骤 一、加载时机 ---- 1、隐式加载 加载 的 隐式加载 , 没有明确的说明加载某个 , 但是进行了如下操作 : 使用 new 关键字 直接 创建的实例对象 ; 使用 new 关键字 直接 创建的 子类 实例对象 ; 通过 反射方式 创建 / 子类 实例对象 ; 访问 的 静态变量 , 对静态变量 进行 读 或者 写 操作 都会触发 隐式加载 ; 访问 的 静态函数 ; 2、显式加载 显式加载 : 明确的说明要加载某个 , 使用 Class.forName() 加载指定的 ; 使用 ClassLoader.loadClass 加载指令的 ; 二、加载步骤 ---- 参考 【Java 虚拟机原理】Java 加载过程 ( 加载 | 连接 - 验证 准备 解析 | 初始化 | 使用 | 卸载 ) 博客 ; 加载步骤 : ① 装载 : 加载某个时 , 首先要 查找 并 导入 Class 字节码文件 ; ② 链接 : 该阶段 , 可以分为以下 3 个子阶段 ; 验证 : 验证字节码文件是否正确 ; 准备 :

    2.5K30编辑于 2023-03-30
  • 来自专栏在水一方

    加载小结

    本节来学习加载机制 什么是加载 简单来说就是将.class文件实例成Class对象并进行初始化的过程,字节码必须通过加载过程加载到JVM环境后才可以执行 classloder(加载器)的使命就是将 .class文件加载到内存中,在启动之初进行的Load、Link和Init,在加载时使用的是双亲委派模型 加载 加载过程 1 加载阶段读取文件产生的二进制流并转为特定的数据结构,创建对应的 加载器 字节码文件加载到内存就是通过加载器来实现的,加载器类似于原始部落结构存在权力等级,最高的一层是家族中威望最高的Bootstrap,它是jvm启动时创建的,是通过C来实现的,并不存在于JVM 中 双亲委派模型 加载器之间的这种层次关系就是双亲委派模型。 双亲委派模型要求除了顶层的启动加载器外,其他的加载器都应有自己的父加载器 这部分内容是对第一张图中加载这个方框部分的内容的拓展

    36720编辑于 2022-06-14
  • 来自专栏Vincent-yuan

    加载过程

    的生命周期 加载过程 加载 验证 准备 解析 初始化 卸载 的生命周期 一个的完整生命周期如下: 加载过程 Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 一个非数组加载阶段(加载阶段获取的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义加载器去控制字节流的获取方式(重写一个加载器的 loadClass() 方法)。 数组类型不通过加载器创建,它由 Java 虚拟机直接创建。 加载器、双亲委派模型也是非常重要的知识点,这部分内容会在后面的文章中单独介绍到。 该类没有在其他任何地方被引用 该类的加载器的实例已被 GC 所以,在 JVM 生命周期内,由 jvm 自带的加载加载是不会被卸载的。但是由我们自定义的加载加载是可能被卸载的。 而我们自定义的加载器的实例是可以被回收的,所以使用我们自定义加载加载是可以被卸载掉的。 参考

    81320发布于 2021-11-01
  • 来自专栏Apache IoTDB

    加载机制

    加载器并不需要等到某个被“首次主动使用”时再加载它,JVM 规范允许加载器在预料某个将要被使用时就预先加载它,如果在预先加载的过程中遇到了 .class 文件缺失或存在错误,加载器必须在程序首次主动使用该类时才报告错误 /md/java/jvm/java-jvm-classload.html 2 加载机制 2.1 双亲委派机制 双亲委派机制是指如果一个加载器收到了加载的请求,它首先不会自己去尝试加载这个,而是把请求委托给父加载器去完成 ,依次向上,因此,所有的加载请求最终都应该被传递到顶层的启动加载器中,只有当父加载器 在它的搜索范围中没有找到所需的时,即无法完成该加载,子加载器才会尝试自己去加载该类。 既然是加载这个时出现的问题,我们首先要知道是哪个加载器在尝试加载这个。 结合加载机制中的全盘负责机制,我们知道这个匿名是由加载依赖它的 org.apache.iotdb.MySum 的加载器来加载的,我们把这个加载器记为 A。

    82210编辑于 2023-03-21
  • 来自专栏老铁丁D

    加载机制

    加载器只用于实现加载动作。对于任意一个,都需要由加载它的加载器和这个本身一同确立其在Java虚拟机中的唯一性,每一个加载器,都拥有一个独立的名称空间。 从开发人员的角度加载器有三种:启动加载器,扩展加载器,应用程序加载器 启动加载器:负责将存放在<JAVA_HOME>\lib目录中的加载到虚拟机内存中 扩展加载器:负责将存放在<JAVA_HOME >\lib\ext目录中的加载到虚拟机内存中 应用程序加载器:它负责加载用户路径(ClassPath)上所指定的库 双亲委派机制 加载器之间如下图的这种层次关系,称为加载器的双亲委派模型。 双亲委派模型的工作过程:如果一个加载器收到了加载的请求,它首先不会自己去尝试加载这个,而是把这个请求委派给父加载器去完成,每一个层次的加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动加载器中 例如java.lang.Object,它存放在rt.jar之中,无论哪一个加载器要加载这个,最终都是委派给处于模型最顶端的启动加载器进行加载,因此Object在程序的各种类加载器环境中都是同一个

    64920编辑于 2022-08-12
  • 加载

    用户可以自己定义加载器来加载。 逻辑是从自定义加载器一直往上父加载器递归调用,直到扩展加载器发现没有parent了,就会去查看引导加载器加没加载过该类。 加载顺序应该是先查看引导加载器是否加载,再由父加载器尝试加载,最后是子类加载器自己加载。 双亲委派:向上委派过程:第一步: 将自定义加载器挂载到应用程序加载器;第二步: 应用程序加载器将请求委托给扩展加载器;第三步: 扩展加载器将请求委托给启动加载器。 向下委派的加载过程(报ClassNotFund的过程):第一步: 启动加载器在加载路径下查找并加载Class文件,如果没有找到就交给扩展加载加载 第二步:扩展加载器在它的加载路径下查找并加载Class

    30700编辑于 2024-03-25
  • 来自专栏从零开始的Code生活

    加载过程

    的生命周期 加载->连接->初始化->使用->卸载 其中连接包括:验证->准备->解析 加载过程 Class文件需要加载到虚拟机之后才能运行。 系统加载Class文件的步骤:加载->连接->初始化。 加载 1.通过全加载该类对应的二进制字节流。 2.将该二进制字节流代表的静态存储结构存到方法区的运行时数据结构中。 一个非数组加载阶段可控性最强,可以在这个阶段自定义加载器去控制字节流的获取方法(重写加载器的classLoad()方法)。数组类型不通过加载器创建,他直接由JVM创建。 加载和连接阶段的部分阶段是可以交叉执行的,加载阶段尚未结束,连接过程可能就开始了。 验证 文件格式验证。 元数据验证。 字节码验证。 符号引用验证。 准备 准备阶段为变量分配内存并赋初始值的过程。 3.加载该类的加载器被GC。 参考:JavaGuide

    59710编辑于 2022-01-14
  • 来自专栏刘晓杰

    加载

    加载器基本概念 顾名思义,加载器(class loader)用来加载 Java 到 Java 虚拟机中。 加载器的代理模式 加载器在尝试自己去查找某个的字节代码并定义它时,会先代理给其父加载器,由父加载器先去尝试加载这个,依次类推。 加载的过程 在前面介绍加载器的代理模式的时候,提到过加载器会首先代理给其它加载器来尝试加载某个。这就意味着真正完成加载工作的加载器和启动这个加载过程的加载器,有可能不是同一个。 也就是说,哪个加载器启动加载过程并不重要,重要的是最终定义这个加载器。两种类加载器的关联之处在于:一个的定义加载器是它引用的其它的初始加载器。 加载器在成功加载某个之后,会把得到的 java.lang.Class的实例缓存起来。下次再请求加载该类的时候,加载器会直接使用缓存的的实例,而不会尝试再次加载

    75030发布于 2019-02-21
  • 来自专栏java架构计划训练营

    加载

    概念 加载 加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个的java.lang.Class对象 链接:将Java的二进制代码合并到 JVM的运行状态之中的过程 验证:确保加载信息符合JVM规范,没有安全方面的问题 准备:正式为变量(static)分配内存并设置变量默认初始化值的阶段,这些内存都将在方法区中进行分配 解析:虚拟机常量池的符号引用 比如:当通过子类引用父的静态变量,不会导致子类初始化 通过数组定义引用,不会触发此类的初始化 引用常量不会触动此类的初始化(常量在链接阶段就存入调用的常量池中了) 加载的作用 将class文件字节码内容加载到内存中 缓存 标准的JavaSE加载起器可以按要求查找,但一旦某个加载加载器中,它将维持加载(缓存)一段时间。 main(String[] args) { A a=new A(); System.out.println(A.m); /** * 1.加载到内存

    43410编辑于 2022-06-14
  • 来自专栏足球是圆的

    加载

    加载器虽然只用于实现加载动作,但它在Java程序中起到的作用却远远不限于加载阶段。比如判断两个是否“相等”,只有两个是由同一个加载加载的前提下才有意义。 * 应用程序加载器(Application ClassLoader),这个加载器也称为“系统加载器”,负责加载用户路径(ClassPath)上所指定的库。 加载器双亲委派模型要求除了顶层的启动加载器外,其它的加载器都应该有自己的父加载器。这里的加载器之间的父子关系不是通过继承实现的,都是使用组合关系来复用父加载器的代码。    加载器双亲委派模型的工作过程:如果一个加载器收到加载的请求,它首先把这个请求委派给父加载器去完成,每一层次的加载器都是如此,因此所有的加载请求都应该传到顶层的启动加载器中,只有当父加载器反馈自己无法完成这个加载请求时 由于只能向上委派,到了启动加载器后不能往下询问,即顶层的加载器,无法访问底层的加载器所加载

    75130发布于 2019-09-24
  • 来自专栏only theone 的记录

    加载机制

    1.访问的编译期静态常量时,不会触发的初始化行为。的初始化行为是指在加载之后(也就是的Class对象被创建之后),为的静态成员变量分配存储空间。 2.编译期静态常量会在编译阶段被存储到NonInitialization的常量池中,在以后对编译期静态常量的引用都实际上被替换为对NonInitializaion对自身常量池的引用,所以访问的编译期静态常量并不会触发的初始化行为 3.初始化一个之前,会先初始化该类的父

    44110发布于 2019-11-21
领券