展开

关键词

加载机制

点击上方“晏霖”,选择“置顶或者星标” 曾经有人关注了我 后来他有了女朋友 1.6加载机制 1.6.1概述 学习本章前我们要对文件结构有一个简单的认识,而学习文件结构没有任何难度,更多的是参考《 n 验证 验证是连接的第一步,这个阶段主要是校验class文件的字节流包是否符合《Java虚拟机规范》所规定的,是虚拟机自身保护的机制。 元数据验证:主要是对字节码描述的信息进行语义分析,以保证其描述的信息符合《Java语言规范》的要求,比如说验证这个是不是有父,父是否可以继承、中的字段方法是不是和父冲突等等。 Java中任意一个,都需要由加载它的加载器和这个本身一同确立其在Java虚拟机中的唯一性,每一个加载器,都拥有一个独立的命名空间。 代码清单1-2 加载机制源码 //ValueUtility.java static { SharedSecrets.setJavaCorbaAccess(new JavaCorbaAccess

14420

加载机制

加载机制 Java虚拟机把描述的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的加载机制。 这个的父是否继承了不允许被继承的(被final修饰的)。 如果这个不是抽象,是否实现了其父或接口之中要求实现的所有方法。 验证阶段对于虚拟机的加载机制来说,是一个非常重要的、但却不是必须要执行的阶段,因为验证阶段只有通过或者不通过的差别,只要通过了验证,其后就对程序运行期没有任何影响了。 被访问C是public的,不与访问D处于同一个模块,但是被访问C的模块允许被访问D的模块进行访问。 被访问C不是public的,但是它与访问D处于同一个包中。 script); Thread thread2 = new Thread(script); thread1.start(); thread2.start(); } 运行结果如下,一条线程在死循环以模拟长时间操作

22220
  • 广告
    关闭

    腾讯云精选爆品盛惠抢购

    腾讯云精选爆款云服务器限时体验20元起,还有更多热门云产品满足您的上云需求

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    加载机制

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

    13410

    JVM加载机制

    概述 虚拟机把描述的数据从CLass文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制(懒加载)。 加载过程 加载--连接--初始化--使用--卸载 JVM加载机制 1. 2.1.2 元数据验证 (1)这个是否有父(除了java.lang.Object之外,所有都应当有父)。 (2)这个是否继承了不允许被继承的(被final修饰的)。 (3)如果这个不是抽象,是否实现了其父或接口之中所要求实现的所有方法。 (因为Object是所有的父) 双亲委派模型 通俗的讲,就是某个特定的加载器在接到加载的请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成加载任务,就成功返回;只有父加载器无法完成此加载任务时

    29230

    Java加载机制

    在了解的加载机制之前,我们需要了解一下的生命周期。 加载器 Java的加载需要用到加载器。加载器负责装入,搜索网络,jar,zip,文件夹,二进制数据,内存等指定位置的资源。 一个Java程序运行,至少有3个不同的加载器实例,负责加载不同的。 双亲委派模型 Java中的并不会重复加载,同一加载器,同一名,代表的是同一个。而避免重复加载的主要原因在于JVM在加载时默认采用的是双亲委派模型。 的卸载 JVM中的不可能一直存在,在满足一定条件的情况下会被卸载掉。

    28110

    Java加载机制

    3.1 加载机制 ? 缓存机制:缓存机制会保证所有加载过的Class都会被缓存,当程序中需要使用某个时,加载器先从缓冲区搜索该类,若搜寻不到将读取该类的二进制数据并转换成Class对象存入缓冲区中。 changed 可见,在JDK 9中,应用程序加载器可以委托给平台加载器以及引导加载器;平台加载器可以委托给引导加载器和应用程序加载器。 此外,JDK 9不再支持扩展机制。 JDK 9中的加载机制有所改变。三个内置的加载器一起协作来加载。 JDK 9中的加载机制有所改变。三个内置的加载器一起协作来加载。 JDK 9中的加载机制有所改变。 source:https://chenzhuo233.github.io/2019/09/28/JVM加载机制/ ? 喜欢,在看

    13830

    Java加载机制

    1、描述的加载过程及各个步骤的主要工作? 答: 的加载过程可以大体分为三个大的阶段:加载、连接、初始化。其中,连接阶段又可以细分为:验证、准备、解析这三个阶段。 答:当某个加载器在接到加载的请求时,会将加载任务委托给父加载器,依次递归,父加载器可以完成加载任务,就成功返回;不能加载则子类加载器自己完成加载。 有3加载器: 启动加载器(Bootstrap ClassLoader) 扩展加载器(Extension ClassLoader) 应用程序加载器(Application ClassLoader ) 但用户还可以自定义加载器。 意义:双亲委派避免的重复加载问题,以及避免Java核心的API被篡改,保证了代码安全。

    23031

    JVM加载机制

    (JVM的自我保护机制) 正常运行Java程序可以通过.java编译成class文件,然后交由JVM执行。编译器虽然本身可以检测Java的安全问题。 初始化 为的静态变量赋予正确的初始值 当虚拟机启动时,用户需要指定一个要执行的主(包含main()方法的那个),虚拟机会先初始化这个主。 (main所在) 当初始化一个的时候,如果发现其父还没有进行过初始化,则需要先触发其父的初始化。 加载器 启动(Bootstrap)加载器 启动加载器主要加载的是JVM自身需要的,它负责将 /lib路径下的核心库或-Xbootclasspath参数指定的路径下的jar包加载到内存中 这个加载使用 【举个例子】每个都有一个共同的父Object,每个在被加载时都会先去加载Object,按照双亲委派模型的思路,所有的都会优先被启动加载器加载,那么也就是说只需要加载一次Object,当其他需要

    17930

    jvm加载机制

    加载机制:虚拟机把描述的数据从class文件加载到,并对数据进行校验、转换解析、初始化,最终形成可以被虚拟机直接使用的java类型。 *开头的),开发者可以直接使用扩展加载器。 双亲委派模型 如果一个加载器收到了加载的请求,它首先不会自己去尝试加载这个,而是把请求委托给父加载器去完成,依次向上,因此,所有的加载请求最终都应该被传递到顶层的启动加载器中,只有当父加载器在它的搜索范围中没有找到所需的时 同一个的定义:即使两个来源于同一个Class文件,只要加载它们的加载器不同,那这两个就必定不相等。 例如,java.lang.Object存放在JDK\jre\lib下的rt.jar之中,因此无论是哪个加载器要加载此类,最终都会委派给启动加载器进行加载,这边保证了Object在程序中的各种类加载器中都是同一个

    27730

    加载机制总结

    加载机制 虚拟机把描述的数据从class文件加载到内存,并且进行校验、解析、初始化。最终形成可以直接使用的Class对象,这就是加载机制。 当用户在自己的代码中,需要某些额外的时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用。 根据加载机制,当被加载的引用了另外一个的时候,需要使用第一个加载器进行加载。 (只有ClassLoader被卸载了,对应的才能被卸载) WebappClassLoader的加载逻辑 tomcat的加载机制是违反了双亲委托模型的,各个web应用自己的加载器(WebAppClassLoader from=singlemessage [Tomcat加载器机制

    24220

    JVM 加载机制

    的加载: 查找并加载的二进制数据 加载是加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情: 【1】通过一个的全限定名来获取其定义的二进制字节流。 加载器并不需要等到某个被“首次主动使用”时再加载它,JVM规范允许加载器在预料某个将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,加载器必须在程序首次主动使用该类时才报告错误 初始化 初始化,为的静态变量赋予正确的初始值,JVM负责对进行初始化,主要对变量进行初始化。 ; 【2】假如该类的直接父还没有被初始化,则先初始化其直接父; 【3】假如中有初始化语句,则系统依次执行这些初始化语句 初始化时机:只有当对的主动使用的时候才会导致的初始化,的主动使用包括以下六种 ")); 【5】初始化某个的子类,则其父也会被初始化; 【6】Java虚拟机启动时被标明为启动(Java Test),直接使用 java.exe命令来运行某个主; 使用 访问方法区内的数据结构的接口

    15520

    加载机制”详解

    概述 虚拟机的加载机制:虚拟机把描述的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。 A:“MyChild1”有被加载。 ? ② 当初始化一个的时候,如果发现其父还没有进行过初始化,则需要先触发其父的初始化。 ? 所以’Object’会是第一个被初始化的。 注意,这里是“父全部”而不是“全部父”。因为Java是单继承的,每个Java只会有一个父,而父又可以有它的父。。。 ② 元数据验证; ③ 字节码验证; ④ 符号引用验证 对于虚拟机的加载机制来说,验证阶段是一个非常重要的、但不是一定必要(因为对程序运行期没有影响)的阶段。 (注意,这里是“父全部”而不是“全部父”。因为Java是单继承的,每个Java只会有一个父,而父又可以有它的父。。。而且每一个父(即,这个)只会被初始化一次。)

    68610

    JVM加载机制

    3、在内存中生成一个代表这个的Class对象,作为方法区这个的各种数据的访问入口。 特殊: 数组本身不通过加载器创建,由Java虚拟机直接创建。 2、元数据验证 ,对的元数据进行语义校验(抽象需要实现父或接口中要求实现的所有方法,的父是否集成了final)。 3、字节码验证,对的方法体进行校验分析,保证运行时不会危害虚拟机安全。 3、初始化时,有父则先初始化父。 4、虚拟机启动时,先初始化主(包含main()方法)。 5、JDK 1.7动态语言支持,MethodHandle实例解析结果方法句柄对应的要先初始化。 七、加载器 任意一个,都需要由加载它的加载器和这个本身一同确立其在JVM中的唯一性。 双亲委派模型的特殊情况: 1、代码热替换、模块热部署,OSGi实现模块化热部署的关键是它自定义的加载器机制的实现。

    18830

    Java 机制(3)---- 文件结构

    在这篇文章中我们来一起看一下 class 文件的结构,来进一步加深我们对虚拟机的加载机制机制的理解。本文参考了 《深入理解 Java 虚拟机》一书。 再论加载 ​ 回想一下我们在上篇文章中讨论的 Java 加载机制,需要经过五大步骤:加载、验证、准备、解析、初始化。 其实 验证过程是最复杂的,因为这个过程需要扫描整个在加载过程中得到得到的 .class 文件格式的二进制数据,也就是相当于将我们在上面模拟的解析 .class 文件的过程,并且判断相关的数据是否合法,比如文件的魔数是否为 而在解析这一步中虚拟机需要将中出现的符号引用替换为直接引用,这个过程可能又会触发其他的加载,比如有两个 A 和 B , B 中有一个 A 的引用,那么在加载 B 的时,在解析过程中发现引用了 好了,在这篇文章中我们通过一个例子来看了一下文件格式,相信你对 Java 机制有了一个更深的理解。如果博客中有什么不正确的地方,还请多多指点。如果觉得这篇文章对您有帮助,请不要吝啬您的赞。

    29320

    Java 机制(2)---- 加载过程

    虚拟机成功加载该类并运行,所以在上面调用 java Main 命令等同于 java -classpath "C:\Users\MAIBENBEN\Desktop\blog\Java常用技术\Java 机制 :-classpath "C:\Users\MAIBENBEN\Desktop\blog\Java常用技术;C:\Users\MAIBENBEN\Desktop\blog\Java常用技术\Java 机制 双亲委派模型 双亲委派模型是 Java 虚拟机默认的加载机制,也是其推荐的加载机制,其流程如下:当某个加载器要加载某个时,先判断该类有没有被当前加载器加载过,如果加载过,则直接返回对应 Class 对象,否则如果其存在父加载,则会先委托其父加载器进行加载这个,否则委托启动加载器加载。 好了,这篇文章中我们详细看了一下关于 JVM中加载的机制,下一篇文章我们将一起研究一下 class 文件的格式,届时会再度回顾这篇文章的某些内容。

    42920

    JVM 加载机制详解

    JVM 加载机制详解 加载 什么是的加载 jvm将class文读取到内存中,经过对class文件的校验、转换解析、初始化最终在jvm的heap和方法区分配内存形成可以被jvm直接使用的类型的过程。 到了初始阶段,才开始真正执行中定义的Java程序代码。 初始化阶段是执行构造器方法的过程。方法是由编译器自动收集中的变量的赋值操作和静态语句块中的语句合并而成的。 常量在编译期间会存入调用的常量池中,本质上并没有直接引用定义常量的,不会触发定义常量所在的。 通过名获取Class对象,不会触发的初始化。 加载器 虚拟机设计团队把加载动作放到JVM外部实现,以便让应用程序决定如何获取所需的,JVM提供了3种加载器: 启动加载器(Bootstrap ClassLoader):负责加载 JAVA_HOME JVM通过双亲委派模型进行的加载,当然我们也可以通过继承java.lang.ClassLoader实现自定义的加载器 当一个加载器收到加载任务,会先交给其父加载器去完成,因此最终加载任务都会传递到顶层的启动加载器

    18710

    JVM的加载机制

    加载的过程主要分为以下3个步骤: 根据的全限定名取得的二进制流 注意这里指定的是的二进制流而不是说.class文件,由此可知这是个典型的面向接口编程呀,基于这个机制,我们可以把放在任何地方。 引用的是否存在 对引用的、方法、属性是否有权限访问 等其他引用内容的验证 准备 准备阶段主要是为变量分配内存并且设置初始值。 、字段、方法、接口方法、方法类型、方法句柄和调用点限定符7符号引用 初始化 初始化阶段主要是为的静态变量(准备阶段涉及的变量)赋予正确的初始值 这里需要注意的是,初始化阶段不是紧跟着解析进行的,而是当对的主动使用才引起的的初始化 以下几种情况会引起的初始化: new关键字 static变量的get、set(final类型的不算) static方法的调用 执行构造方法 反射 初始化子类时会首先初始化父 被标示为启动(Main 方法所在的) ?

    20610

    【Jvm】Jvm加载机制

    加载时机 虚拟机把描述的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的加载机制。 PS: NoClassDeFoundError:发生在生命周期中解析阶段找不到相应的 ClassNotFoundException发生在生命周期的加载阶段,找不到相应的。 元数据验证:是否存在父,父的继承链是否正确,抽象是否实现了其父或接口之中要求实现的所有方法,字段、方法是否与父产生矛盾等。 第二阶段,保证不存在不符合 Java 语言规范的元数据信息。 对进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。 当初始化的父还没有进行过初始化,则需要先触发其父的初始化。 加载器 即使两个来源于同一个 Class 文件,被同一个虚拟机加载,只要加载它们的加载器不同,那这两个也不相等。 双亲委派模型 双亲委派模型的加载逻辑可参考如下代码: ?

    19350

    flink的加载机制

    我们知道,在 JVM 中,一个加载的过程大致分为加载、链接(验证、准备、解析)、初始化5个阶段。 而我们通常提到的加载, 就是指利用加载器(ClassLoader)通过的全限定名来获取定义此类的二进制字节码流,进而构造出的定义 我们先来卡一个普通的加载顺序 ? 从上图可知,通常的加载都是委托给最顶成的启动进行加载,flink同样提供了这样的加载器ParentFirstClassLoader /** * Regular URLClassLoader ChildFirstClassLoader 加载器并作为默认策略。 child-first优先从Flink任务(jar包)中加载,parent-first优先从Flink集群加载

    76440

    Java 加载机制详解

    加载机制是 Java 语言的一大亮点,使得 Java 可以被动态加载到 Java 虚拟机中。 这次我们抛开术语和概念,从例子入手,由浅入深地讲解 Java 的加载机制。 本文涉及知识点:双亲委托机制、BootstrapClassLoader、ExtClassLoader、AppClassLoader、自定义网络加载器等 文章涉及代码: https://github.com /wingjay/HelloJava/blob/master/common/src/classloader/HelloClassLoader.java 什么是 Java 加载机制? 从源码角度真正理解双亲委托加载机制 上面已经通过一些例子了解了双亲委托的一些特性了,下面来看一下它的实现代码,加深理解。 本文力求通过简单的语言和合适的例子来讲解其中双亲委托机制、自定义加载器等,并开发了自定义的NetworkClassLoader。

    28310

    相关产品

    • 网站渗透测试

      网站渗透测试

      腾讯云渗透测试是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节,并提供安全加固意见帮助客户提升系统的安全性。另外腾讯云渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券