一:前言

Java语言的类型可以分为两大类:基本类型和引用类型。

基本类型  包括byte,short,int,long,float,double,boolean,char。

引用类型  包括类,接口,数组类和泛型参数。由于泛型参数会在编译过程中被擦除,因此Java虚拟机实际上只有前三种。在类,接口和数组类中,数组类是由Java虚拟机直接生成的,其它两种则有对应的字节流。

二:加载

1.加载,就是查找字节流,并且据此生成一个代表这个类的java.lang.Class对象的过程。注意这里字节流不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类)。加载的信息存储在JVM的方法区。

2.对于数组类来说,它并没有对应的字节流,而是由Java虚拟机直接生成的。对于其它的类来说,Java虚拟机则需要借助类加载器来完成查找字节流的过程。

3.类加载器有两种,一种是启动类加载器,其它的类加载器都是java.lang.ClassLoader的子类。启动类加载器是由C++实现的,没有对应的Java对象,因此在Java中只能用null代替。除了启动类加载器之外,另外两个重要的类加载器是扩展类加载器和应用类加载器,均由Java核心类库提供。 启动类加载器加载最为基础,最为重要的类,如JRE的lib目录下jar包中的类;扩展类加载器的父类是启动类加载器,它负责加载相对次要,但又通用的类,如JRE的lib/ext目录下jar包中的类;应用类加载器的父类加载器则是扩展类加载器,它负责加载应用程序路径下的类。

4.JVM通过双亲委派模型进行类的加载,当然我们也可以通过继承java.lang.ClassLoader实现自定义的类加载器。当一个类加载器收到类加载任务,会先交给其父类加载器去完成,因此最终加载任务都会传递到顶层的启动类加载器,只有当父类加载器无法完成加载任务时,才会尝试执行加载任务。

采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个Object对象。

三:链接

链接,是指将创建成的类合并至Java虚拟机中,使之能够执行的过程。它分为验证,准备和解析三个阶段。

1.验证

该阶段的目的在于确保被加载类能够满足Java虚拟机的约束条件。

2.准备

该阶段的目的是为被加载类的静态字段分配内存,即在方法区中分配这些变量所使用的内存空间。Java代码中对静态字段的具体初始化,则会在稍后的初始化阶段中进行。

3.解析

在class文件被加载至Java虚拟机前,这个类无法知道其它类及其方法,字段所对应的具体地址。甚至不知道自己方法,字段的地址。因此,每当需要引用这些成员时,

Java编译器会生成一个符号引用。在运行阶段,这个符号引用一般能够无歧义地定位到具体目标上。解析阶段的目的,正是将这些符号引用解析为实际引用。如果符号引用

指向一个未被加载的类,或者未被加载类的字段或方法,那么解析将触发这个类的加载。

四:初始化

1.初始化阶段是类加载最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器以外,其它操作都由JVM主导。到了初始阶段,才开始真正执行类中定义的Java程序代码。

2.在 Java 代码中,如果要初始化一个静态字段,我们可以在声明时直接赋值,也可以在静态代码块中对其赋值。

如果直接赋值的静态字段被 final 所修饰,并且它的类型是基本类型或字符串时,那么该字段便会被 Java 编译器标记成常量值(ConstantValue),其初始化直接由 Java 虚拟机完成。除此之外的直接赋值操作,以及所有静态代码块中的代码,则会被 Java 编译器置于同一方法中,并把它命名为 < clinit >。

类加载的最后一步是初始化,便是为标记为常量值的字段赋值,以及执行 < clinit > 方法的过程。Java 虚拟机会通过加锁来确保类的 < clinit > 方法仅被执行一次。

只有当初始化完成之后,类才正式成为可执行的状态。

3.JVM 规范枚举类的初始化被触发的情况:

a.当虚拟机启动时,初始化用户指定的主类;

b.当遇到用以新建目标类实例的 new 指令时,初始化 new 指令的目标类;

c.当遇到调用静态方法的指令时,初始化该静态方法所在的类;

d.当遇到访问静态字段的指令时,初始化该静态字段所在的类;

e.子类的初始化会触发父类的初始化;

f.如果一个接口定义了 default 方法,那么直接实现或者间接实现该接口的类的初始化,会触发该接口的初始化;

j.使用反射 API 对某个类进行反射调用时,初始化这个类;

h.当初次调用 MethodHandle 实例时,初始化该 MethodHandle 指向的方法所在的类。

五:总结

深入理解Java类加载机制相关推荐

  1. 深入理解——Java类加载机制

    我们知道,我们写的java文件是不能直接运行的,我们可以在IDEA中右键文件名点击运行,这中间其实掺杂了一系列的复杂处理过程.这篇文章,我们只讨论我们的代码在运行之前的一个环节,叫做类的加载.按照我写 ...

  2. 深入理解java虚拟机_深入理解Java类加载

    本文目的: 深入理解Java类加载机制; 理解各个类加载器特别是线程上下文加载器; Java虚拟机类加载机制 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最 ...

  3. Java类加载机制的理解

    算上大学,尽管接触Java已经有4年时间并对基本的API算得上熟练应用,但是依旧觉得自己对于Java的特性依然是一知半解.要成为优秀的Java开发人员,需要深入了解Java平台的工作方式,其中类加载机 ...

  4. 深入理解Java虚拟机之Java类加载机制,Java类实例化过程详解。

    目录 Java类加载机制 类加载过程 加载(Loading) 连接(Linking) 初始化(Initialzation) 使用(Useing) 卸载(Unloading) 引言 什么情况下开始类加载 ...

  5. 两道面试题,带你解析Java类加载机制

    2019独角兽企业重金招聘Python工程师标准>>> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa {static ...

  6. 谈谈 Java 类加载机制

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 来源:Rainstorm , github.com/c-rainstorm/blog/blob/m ...

  7. Java类加载机制:双亲委托模型

    Java类加载机制:双亲委托模型 前言(废话) 一如既往,这篇博客是我极为浅显的理解,仅仅是我记录我自己成长的一环而已.我以前听我老师说过,什么是进步,进步就是当你三个月后重新再看自己的代码,发现那就 ...

  8. Java类加载机制深度分析

    为什么80%的码农都做不了架构师?>>>    Java类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. ...

  9. java加载机制_详解Java类加载机制

    一:ClassLoader 从JVM结构图中可以看到,类加载器的作用是将Java类文件加载到Java虚拟机. HotSpot JVM结构,图片来自Java Garbage Collection Bas ...

最新文章

  1. java8 内存模型_java8内存模型
  2. PHP算法使用__call优化代码
  3. U3D-FSM有限状态机的简单设计
  4. P1297-[国家集训队]单选错位【期望概率】
  5. junit mockito_从工作中清除代码–使用JUnit 5,Mockito和AssertJ编写可执行规范
  6. python小甲鱼练习题答案_小甲鱼Python第 013讲元组:戴上了枷锁的列表 | 课后测试题及参考答案...
  7. c语言dfs算法全排列代码,c语言dfs解决全排列问题
  8. 服务器raid1重装系统,做软RAID1 重装系统后数据会丢失吗
  9. KVM Virtio: An I/O virtualization framework for Linux(Linux虚拟IO框架)
  10. Vue-Cli3 使用jquery
  11. 计算机 中职生学情分析,信息技术学情分析
  12. 十次方:服务器的1U、2U、U代表什么意思?
  13. spring事物配置备份
  14. 英特尔 超核芯显卡 620mac_显卡性能翻倍,AI能力加持:英特尔发布10代酷睿处理器...
  15. 正弦信号发生器(A题)
  16. android手机导出日志adb logcat
  17. Ubuntu 安装sogo输入法
  18. 域名里gTLD、new gTLD、ccTLD的含义之间的关系
  19. SSM疫情医院管理系统实训项目总结
  20. 超融合网络常见问题及解决思路

热门文章

  1. KdPrint 在checked 和free版本的不同
  2. [Windows驱动开发](三)基础知识——驱动例程
  3. Windows Sockets 2.0 新特性
  4. 1_3 SingletonMode 单例模式
  5. 第02讲:夯实根基,Web 网页基础
  6. Docker 部署不香吗?
  7. Kafka监控架构设计
  8. 无人值守的自动 dump(二)
  9. 音视频技术开发周刊 | 191
  10. 音视频技术开发周刊 | 166