一、概述 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。...当虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类。...至于是否要触发子类的加载和验证,在虚拟机规范中并未明确规定,这点取决于虚拟机的具体实现。...加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,方法区中的数据存储格式由虚拟机实现自行定义,虚拟机规范未规定此区域的具体数据结构。...Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/虚拟机类加载机制
虚拟机把字节码文件从磁盘加载进内存的这个过程,我们可以粗糙的称之为「类加载」,因为「类加载」不仅仅是读取一段字节码文件那么简单,虚拟机还要进行必要的「验证」、「初始化」等操作,下文将一一叙述。...验证 验证阶段的目的是为了确保加载的 Class 文件中的字节流是符合虚拟机运行要求的,不能威胁到虚拟机自身安全。 这个阶段「把控」的如何,将直接决定了我们虚拟机能否承受住恶意代码的攻击。...当然,如果你觉得验证阶段会拖慢你的程序,jvm 提供:-Xverify:none 启动参数关闭验证阶段,缩短虚拟机类加载时间。...初始化 初始化阶段是类加载的最后一步,在这个阶段,虚拟机会调用编译器为类生成的 「」 方法执行对类变量的初始化语句。...总结一下,有关虚拟机类加载机制的相关内容,网上的资料大多相同并且对于一些细节之处很粗糙的一带而过,我也是看了很多的资料,尽可能的描述这其中的细节。
加载阶段在什么情况下进行,虚拟机规范中并没有强制约束,这点可以交个虚拟机的具体实现来自由把握。...4).当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。 ...虚拟机规范这三点并不具体,因此虚拟机实现与具体应用的灵活度相当大。...加载完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区中,方法区中的数据存储格式由虚拟机实现自行定义,虚拟机规范未规定此区域的具体数据结构。...验证阶段对于虚拟机的类加载机制来说,是一个非常重要、但不一定是必要的阶段。
4.当虚拟机启动时,用户需要指定一个执行的主类(包含main()方法的类),虚拟机会先初始化这个类。...二 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。...三 双亲委派模型 从java虚拟机的角度讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用c++实现,是虚拟机自身的一部分;另一种就是所有其它的类加载器...,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机中。...参考资料:深入理解java虚拟机 第二版
概述 在详细讲述类加载机制之前, 我们先了解一下JVM的内存结构图, 通过内存结构图,再理解类加载中的相关细节就会简单很多。 内存结构图 根据内存简图。...当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先 初始化这个主类。...符号引用与虚拟机实现的内存布局无关,引 用的目标并不一定是已经加载到虚拟机内存当中的内容。...public static void main(String[] args) { System.out.println("hello,String"); } } 由于双亲委派机制一直找父类...沙箱机制 是为了保证对Java核心源代码的保护而出现的机制
虚拟机类加载机制 简述java类加载机制? 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。...描述一下JVM加载Class文件的原理机制 Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。...Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。...类装载分为以下 5 个步骤: 加载:根据查找路径找到相应的 class 文件然后导入; 验证:检查加载的 class 文件的正确性; 准备:给类中的静态变量分配内存空间; 解析:虚拟机将常量池中的符号引用替换成直接引用的过程
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。...当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先初始化这个主类。...验证(特别耗时) 验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。...类加载器模型 双亲委派模型 从java虚拟机角度来讲,只存在两种不同的类加载器:一种是启动类加载器,使用C++语言实现,是虚拟机自身的一部分;另一种是所有其他类的加载器,由java语言实现,独立于虚拟机外部...OSGi实现模块化热部署的关键则是它自定义的类加载器机制的实现。每一个程序模块都有一个自己的类加载器,当需要更换一个Bundle时,就把Bundle连同类加载器一起换掉以实现代码的热替换。
随着编程经验的日积月累,越来越感觉到了解虚拟机相关要领的重要性。闲话不多说,老规矩,先来一段代码吊吊胃口。...上面就牵涉到了虚拟机类加载机制。如果有兴趣,可以继续看下去。...验证 验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。...当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。...程序跑一下就知道结果,如果想知道为什么,请在下方留言~~ 参考文献:《深入理解java虚拟机》周志明 著.
虚拟机把类的数据从class文件加载到内存,并对class文件中的数据进行校验、转换、解析、初始化等操作后,最终形成可以被虚拟机识别并使用的过程就叫做“虚拟机的类加载”。...但是,什么时候会进行“加载”,虚拟机规范中并没有强制约束,而是交给具体的虚拟机实现来完成。...在HotSpot中,Class对象并不存在于JVM虚拟机堆中,而是存在于方法区中。 在虚拟机中,当程序主动使用某个类时,如果该类还未被加载到内存中,JVM虚拟机会进行加载操作,直至初始化完成。...验证 在完成加载阶段后,JVM虚拟机开始验证阶段,此阶段的目的很简单,很纯粹,就是为了保证class文件中的内容符合虚拟机的规范要求,在实际运行时不会威胁到虚拟机自身的安全。...(4)当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。 在之前的准备阶段,类中定义的static静态变量已经被赋过一次零值。
加载阶段完成后,虚拟机外部的 二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。...站在Java虚拟机的角度来讲,只存在两种不同的类加载器:启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有很多其他的虚拟机是用Java语言实现的),是虚拟机自身的一部分...三、验证 验证的目的是为了确保Class文件中的字节流包含的信息符合当前虚拟机的要求,而且不会危害虚拟机自身的安全。...最后需要注意:理论上是按照上述顺序进行搜索解析,但在实际应用中,虚拟机的编译器实现可能要比上述规范要求的更严格一些。...因此,在虚拟机中第一个被执行的()方法的类肯定是java.lang.Object。
一、类加载简介 类的加载机制是指把编译后的.class类文件的二进制数据读取到内存中,并为之创建一个java.lang.Class对象,用来封装类在元数据空间的数据结构。 ?...2、连接阶段 验证 目的在于确保Class文件的字节流中包含的信息符合当前虚拟机的要求,保证加载类的正确性,不会危害虚拟机自身的安全,主要包括四种检验动作: 文件格式验证:验证字节流是否符合Class文件格式的规范...三、机制策略 1、双亲委派模式 ?...则依次向上委托,因此类加载请求最终都应该被传递到顶层的启动类加载器中; 如果父类加载器可以完成类加载请求,就直接成功返回,只有当父加载器在无法完成该加载,子加载器才会尝试自己去加载该类; 2、沙箱安全机制...String且所在包为java.lang,在使用引导类加载器加载时会先加载JDK中的String类,因为这个类本来是属于jdk的,后面再次出现String类就会报错,以此保证源代码不被恶意篡改,这就是沙箱安全机制
0x01、垃圾收集发生的区域 之前我们介绍过 Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程共存亡。...在 Java 技术体系中,可以作为 GC Roots 的对象包括: 在虚拟机栈(栈帧中的本地变量表)中引用的对象 方法区中类静态属性引用的对象 方法区中常量引用的对象 本地方法栈中 JNI(即通常所说的...注意这里所说的执行是指虚拟机会触发这个方法开始运行,但并不承诺一定会等待它运行结束。...关于是否要对类型进行回收,HotSpot 虚拟机提供了 -Xnoclassgc 参数进行控制 0x06、分代收集理论 当前商业虚拟机的垃圾收集器大多数都遵循了“分代收集”的设计理论,分代收集理论其实是一套符合大多数程序运行实际情况的经验法则...一种和稀泥式的解决方案就是让虚拟机平时采用标记 - 清除算法,直到内存空间碎片化程度大到影响对象分配时,再采用标记 - 整理算法收集一次,已获得规整的内存空间
在加载class文件的过程中虚拟机又干了哪些事呢?今天我们来解密虚拟机的类加载机制。...虚拟机把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成可以被虚拟机直接使用的Java类型(Class对象),这就是虚拟机的类加载机制。...对于类加载机制而言,验证阶段是一个非常重要、但不是一定必要的阶段。...以上就是Java虚拟机类加载机制的整个过程以及在每个阶段虚拟机所执行的动作。...以上内容总结了Java类加载机制的整个过程以及双亲委派模型的原理,欢迎交流。
虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验、准备、解析和初始化,最终就会形成可以被虚拟机使用的Java类型,这就是一个虚拟机的类加载机制。...4) 虚拟机启动的时候,会初始化一个有main方法的主类。...2 验证 这个阶段目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。...主要包括四种验证: 文件格式验证:基于字节流验证,验证字节流是否符合Class文件格式的规范,并且能被当前虚拟机处理。 ...(仅仅按照文件名识别的)的类库到虚拟机内存中。
HotSpot JVM把新生区分为三部分:1个Eden区和2个Survivor区,默认内存大小比例为8 : 1 : 1,一般情况下,新创建的对象都会被分配到Ed...
作者:吴亨 前段时间定了个小目标,利用晚上的时间拜读大名鼎鼎的周志明的《深入理解 Java 虚拟机》,才看几章,“人民的名义”火起来了,唉,时间被强行夺了去,小目标眼睁睁的被失败了.........现在的主流虚拟机一般都采用分代回收,新生代、老年代. 一、分代 为什么要分代?有什么意义?这里我们假设没有分代,会怎么样呢? 答案:“stop the world”,程序被卡成翔。
4.当虚拟机启动时,用户需指定一个要加载的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类。...加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,方法区中的数据存储格式由虚拟机实现自行定义。...二、验证 是连接的第一步,确保 Class 文件的字节流中包含的信息符合当前虚拟机要求。 1.文件格式验证:验证字节流是否符合Class文件格式规范,并且能被当前版本的虚拟机处理。...类加载器和双亲委派模型 ◆ ◆ ◆ ◆ 从 Java 虚拟机角度讲,只存在两种类加载器:一种是启动类加载器(C++ 实现,是虚拟机的一部分);另一种是其他所有类的加载器(Java 实现,独立于虚拟机外部且全继承自...摘自《深入理解Java虚拟机》
站在Java虚拟机的角度来讲,只存在两种不同的类加载器:启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有很多其他的虚拟机是用Java语言实现的),是虚拟机自身的一部分...JVM类加载机制 •全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入 •父类委托,先让父类加载器试图加载该类...,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类 •缓存机制,缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在...双亲委派机制: 1、当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。...否则,由于双亲委托机制的存在,会直接导致该类由 AppClassLoader 加载,而不会通过我们自定义类加载器来加载。
如果直接编写了有害的"代码"(字节流),而虚拟机在加载该Class时不进行检查的话,就有可能危害到虚拟机或者程序的安全。...如果无法通过符号引用验证,将抛出一个java.lang.IncompatibleClassChangeError的子类 验证阶段对于虚拟机的类加载机制来说,不一定是必须要的阶段。...各种虚拟机实现的内存布局可能不同,但是它们能接受的符号引用都是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。...2、当通过反射机制对类进行调用时,如果类未初始化,则需要先初始化。 3、当初始化一个类时,如果其父类未初始化,先初始化父类。...Java虚拟机把描述类的数据从Class文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制。
文章目录 一、Android 类加载机制 二、双亲委派机制 一、Android 类加载机制 ---- Android 中的类加载 使用了 双亲委派 机制 , 如下图所示 : 在 Android 中提供了...3 个类加载器 , BootClassLoader , PathClassLoader , DexClassLoader ; 双亲委派机制 , 是 委派层级 上的 上下层级关系 , 并不是说 3...: 如果自己可以加载 A , 则自己加载 ; 如果自己不可以加载 A , 则 抛出 Class Not Found 异常 ; 整个过程就是 从下到上 询问 , 然后 从上到下 委派 ; 二、双亲委派机制...---- 类加载器层级 : 由高到低 : BootClassLoader -> PathClassLoader / DexClassLoader ; 双亲委派机制 : 自定义的类加载器 MyClassLoader
领取专属 10元无门槛券
手把手带您无忧上云