JVM:虚拟机类加载机制

  • Java语言,类型的加载、连接、初始化都是在程序运行期间完成的
  • 类的生命周期:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)
  • 连接(Linking):验证、准备、解析
  • 加载、验证、准备、初始化、卸载这5个阶段的顺序是确定的
  • 有且仅有5种情况必须对类进行“初始化”
    1. 遇到new、getStatic、putStatic、ivokeStatic
    2. 对类进行反射调用
    3. 初始化一个类,如果其父类还没初始化
    4. 虚拟机启动时,执行的主类(包含main)
    5. 当使用1.7的动态语言支持,如果一个java.lang.invoke.MethodHandle实例的最后解析结果有REF_getStatic、REF_putStatic、REF_ivokeStatic,其所对应类也要初始化

    除此之外,所有引用类的方式都不会被初始化,成为被动引用

  • 被动引用的例子
    1. 通过子类调用父类的静态字段。子类不会被初始化
    2. 通过数组定义来引用类,不会触发此类的初始化
    3. 常量在编译阶段会存入调用类的常量池中(常量传播化),本质上并没有直接引用定义常量的类,因此不会触发定义常量的类的初始化
  • 类的加载过程
    1. 通过一个类的全限定名来获取定义此类的二进制字节流(jar、Applet、Proxy、JSP等)
    2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
    3. 在内存中生成一个代表这个类的java.lang.class对象,作为方法区这个类的各种数据的访问入口
  • 验证:文件格式验证、元数据验证、字节码验证、符号引用验证
  • 准备:是正式为类变量分配内存并设置类变量初始值的阶段
  • 解析:虚拟机将常量池内的符号引用替换为直接引用的过程
  • 初始化:<clinit>()方法,非必需
    1. <clinit>()是由编译器自动收集所有类变量的赋值操作和静态语句块合并产生的
    2. 在构造函数之前执行完毕,父类的<clinit>()先执行
    3. 执行接口的<clinit>()不需要先执行父接口的<clinit>()
    4. 只有一个线程去执行这个类的<clinit>()
  • 双亲委派模型
    1. 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,只有父加载器无法完成加载,子加载器才尝试自己去加载
    2. 启动类加载器 <- 扩展类加载器 <- 应用程序加载器 <- 自定义加载器
时间: 2024-11-08 20:13:48

JVM:虚拟机类加载机制的相关文章

深入理解JVM读书笔记三: 虚拟机类加载机制

Java虚拟机类加载机制是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 7.1概述 与那些在编译时需要进行链接工作的语言不同,在Java语言里面,类型的加载和链接过程都是在程序运行期间完成的(其实C++也是分为静态链接库和动态链接库的),这样会在类加载时稍微增加一些性能开销,但是却能为Java应用程序提供高度的灵活性,Java中天生可以动态扩展的语言特性就是依赖运行期动态加载和动态链接这个特点实现的. 7.

【JVM】虚拟机类加载机制

什么是类加载 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. <[JVM]类文件结构>讲的是Class文件结构,即我们编写的Java代码(.java文件)经过编译后生成Class文件(.class文件).这一章讲述的是如何将这个Class文件加载到内存并最终形成虚拟机直接使用Java类型的过程. 1.类加载的时机 类的生命周期 类的生命周期 其中,加载.验证.准备.初始化和卸载这5个顺序

Java虚拟机类加载机制

原文出处: 朱小厮 看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎么加载,博主有很长一段时间也是这么认为的.随着编程经验的日积月累,越来越感觉到了解虚拟机相关要领的重要性.闲话不多说,老规矩,先来一段代码吊吊胃口. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 public cla

虚拟机类加载机制——类加载时机

由于道行不够深,所以此篇类加载机制的讲解主要来自于<深入理解Java虚拟机——JVM高级特性与最佳实践>的第7章 虚拟机类加载机制. 在前面<初识Java反射>中我们在开头提到要了解Java反射,就得要了解虚拟机的类加载机制.在这里,我们来试着窥探一下何为类加载. “虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,类型的加载.连接和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制.”这句话确实读着好懂,但到底类加载做了什么呢?我们都知道

Java虚拟机类加载机制——案例分析

原文出处: 朱小厮 在<Java虚拟机类加载机制>一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬念.建议先看完<Java虚拟机类加载机制>这篇再来看这个,印象会比较深刻,如若不然,也没什么关系~~下面是程序代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package jvm.cla

[转]Java虚拟机类加载机制浅谈

Java语言是一种编译后再经过解释器执行的过程, 解释器主要就是如何处理解释Class文件的二进制字节流.JVM主要包含三大核心部分:运行时数据区,类加载器和执行引擎. 虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验.准备.解析和初始化,最终就会形成可以被虚拟机使用的Java类型,这就是一个虚拟机的类加载机制.Java中的类是动态加载的,只有在运行期间使用到该类的时候,才会将该类加载到内存中,Java依赖于运行期动态加载和动态链接来实现类的动态使用. 一个类的整个生命周期如下:

JVM之类加载机制

JVM之类加载机制 JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 类加载五部分 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口.注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类). 验证 这一阶

7 虚拟机类加载机制

 1 概述? 虚拟机的类加载机制是指,虚拟机把描述类的数据从Class?件加载到内存,并对数据进?验证.准备.解析.初始化等,最终形成可以被虚拟机直接使?的Java类型. 与那些在编译时需要进?链接的语?不同,在Java语???,类型的加载.链接和初始化过程都是在程序运?期间完成的,这种策略虽然会令类加载时稍微增加?些性能开销,但是会为Java应?程序提供?度的灵活性,Java天?可以动态扩展的语?特性就是依赖运?期动态加载和动态链接这个特点实现的. 2 类加载的时机? 类从被加载到虚拟机内存

虚拟机类加载机制(3)——线程上下文类加载器

之所以将线程上下文类加载器(Thread Context ClassLoader)单独拿出来写,确实是因为它涉及的东西比较多,既然带有线程两个字,一定也是非常重要的一个东西. 我们首先来回顾一下类加载器的双亲委派模型. 在上一章<虚拟机类加载机制(2)——类加载器>中我们解释了何为类加载器的“双亲委派模型”,知道了双亲委派模型给我们带了一个好处就是Java类随着它的类一起具备了一种带有优先级的层次关系.简单的例子就是Object类在程序的各种类加载环境中都会由启动类加载器来加载,换言之,它无论

深入理解Java虚拟机-----------虚拟机类加载机制

虚拟机类加载机制 类从被加载到虚拟机内存开始,到卸载出内存为止,整个生命周期包括:加载,验证,准备,解析,初始化,使用,卸载等7个阶段.其中,验证,准备,解析3个部分称为连接. 以上7个阶段中,加载,验证,准备,初始化和卸载五个阶段的顺序是确定的,类的加载过程必需按照这种顺序按部就班的开始(开始并不意味着按部就班的"进行"或"完成",因为这些阶段通常是互相交叉地混合式进行的).而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运