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

    Tomcat8加载机制

    Tomcat8 和 Tomcat6比较大的区别是 : Tomcat8可以通过配置 <Loader delegate="true"/>不打破双亲委托 加载顺序略不同 概述 在 Java 环境中,加载器的布局结构是一种父子树的形式 通常,加载器被请求加载一个特定的或资源时,它会先把这一请求委托给它的父加载器,只有(一个或多个)父加载器无法找到请求的或资源时,它才开始查看自身的仓库。 Tomcat打破了双亲委派顺序 当某个请求想从 Web 应用的 WebappX 加载器中加载时,该类加载器会先查看自己的仓库,而不是预先进行委托处理 Tomcat8 JVM 的 Bootstrap Tomcat8加载顺序: 在加载时,先不进行委托,则每个应用会加载自己的(2/3 Web加载器) 加载不到时委托到再上层Common,Common再委托至System, 4 System加载到就返回, 主要是为了防止一些基础会被web中的覆盖 如果web自定义一个Object呢?首先查找web加载器,就会出问题了。 所以在加载时最先交给Bootstrap加载加载

    1.6K10发布于 2019-05-25
  • 来自专栏shysh95

    Java加载-加载

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

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

    加载

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

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

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

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

    1.4K30编辑于 2023-03-30
  • 来自专栏吉林乌拉

    加载

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

    67230发布于 2019-08-14
  • 来自专栏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
  • 来自专栏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 所有Java中实现的加载器都需要继承ClassLoader这个抽象加载器的设计,JDK88之后的版本差别较大(JDK9之后,出现了模块化设计)。 4.2 JDK8及之前的版本首先来看JDK8及之前的版本,JDK8及之前的版本中默认的加载器有如下几种:启动加载器(Bootstrap ClassLoader、C++实现):加载JAVA_HOME/ 这是因为启动加载器在JDK8中是由C++语言来编写的,在Java代码中去获取既不适合也不安全,所以才返回null(String确实是由启动加载加载的,但是启动加载器由虚拟机底层实现、没有存在Java

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

    加载器与加载过程

    加载器子系统作用 加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 加载信息存放于一块称为方法区的内存空间。 除了的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射) 加载器ClasLoader角色 class file存在于本地硬盘上 > 5 invokevirtual #4 <java/io/PrintStream.println : (Ljava/lang/String;)V> 8 return 用流程图表示上述示例代码:  加载阶段 由于Java采用的是懒加载策略,只有当我们需要用到这个的时候才会去加载他  初始化阶段就是执行构造器方法<clinit>()的过程。

    72030编辑于 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

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

    加载与 Java主加载机制解析

    而在JDK 8中,静态字段不再存储于instanceKlass预留空间,而是转移到instanceKlass的镜像——java. lang.Class的预留空间里去,因此在JDK 8的源码中,上面的这个 虽然调用的地方不同了,但是函数实现的内部机制并没有从根本上发生变化,因此从这一点上看,JDK 6和JDK 8并没有做很大的变更。 JDK 8之所以要将静态字段从instanceKlass迁移到mirror中,也不是没有道理,毕竟静态字段并非Java的成员变量,如果从数据结构这个角度看,静态字段不能算作Java这个数据结构的一部分 ,因此JDK 8将静态字段转移到mirror中。 以上便是一个Java加载的核心流程。了解了加载的核心流程之后,也许聪明的你会忍不住想,Java加载到底何时才会被触发呢?

    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
  • 来自专栏Apache IoTDB

    加载机制

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

    82710编辑于 2023-03-21
  • 来自专栏Vincent-yuan

    加载过程

    的生命周期 加载过程 加载 验证 准备 解析 初始化 卸载 的生命周期 一个的完整生命周期如下: 加载过程 Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 一个非数组加载阶段(加载阶段获取的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义加载器去控制字节流的获取方式(重写一个加载器的 loadClass() 方法)。 「补充,来自issue745」 当一个接口中定义了 JDK8 新加入的默认方法(被 default 关键字修饰的接口方法)时,如果有这个接口的实现发生了初始化,那该接口要在其之前被初始化。 该类没有在其他任何地方被引用 该类的加载器的实例已被 GC 所以,在 JVM 生命周期内,由 jvm 自带的加载加载是不会被卸载的。但是由我们自定义的加载加载是可能被卸载的。 而我们自定义的加载器的实例是可以被回收的,所以使用我们自定义加载加载是可以被卸载掉的。 参考

    82720发布于 2021-11-01
  • 来自专栏老铁丁D

    加载机制

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

    65520编辑于 2022-08-12
  • 来自专栏在水一方

    加载小结

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

    37020编辑于 2022-06-14
  • 加载

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

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

    加载过程

    的生命周期 加载->连接->初始化->使用->卸载 其中连接包括:验证->准备->解析 加载过程 Class文件需要加载到虚拟机之后才能运行。 系统加载Class文件的步骤:加载->连接->初始化。 加载 1.通过全加载该类对应的二进制字节流。 2.将该二进制字节流代表的静态存储结构存到方法区的运行时数据结构中。 一个非数组加载阶段可控性最强,可以在这个阶段自定义加载器去控制字节流的获取方法(重写加载器的classLoad()方法)。数组类型不通过加载器创建,他直接由JVM创建。 6.当一个实现了JDK8新加入的默认方法(被default修饰的方法)时会初始化该接口。 卸载 卸载即该对象被GC。 3.加载该类的加载器被GC。 参考:JavaGuide

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

    加载

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

    75230发布于 2019-02-21
  • 来自专栏only theone 的记录

    加载机制

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

    44210发布于 2019-11-21
  • 来自专栏若尘的技术专栏

    JAVA加载

    其实,加载器并不需要等到某个被“首次主动使用”时再加载它,JVM 规范允许加载器在预料某个将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class 文件缺失或存在错误,加载器必须在程序首次主动使用该类时才报告错误 相对于加载的其他阶段而言,加载阶段是可控性最强的阶段,因为程序员可以使用系统的加载加载,还可以使用自己的加载加载。我们在最后一部分会详细介绍这个加载器。 我们看到 java为我们提供了三个加载器,应用程序都是由这三种加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的加载器。这三种加载器的加载顺序是什么呢? 3、双亲委派原则 他的工作流程是: 当一个加载器收到加载任务,会先交给其父加载器去完成,因此最终加载任务都会传递到顶层的启动加载器,只有当父加载器无法完成加载任务时,才会尝试执行加载任务。 双亲委派原则归纳一下就是: **可以避免重复加载,父已经加载了,子类就不需要再次加载更加安全,很好的解决了各个加载器的基础的统一问题,如果不使用该种方式,那么用户可以随意定义加载器来加载核心

    1.4K75编辑于 2021-12-15
领券