Java 类的加载过程

当程序主动使用某个类时,如果该类还没有加载到内存中,则通过以下三个步骤对类进行加载初始化:

  1. 类的加载:将类的class文件读入内存,并为之创建一个java.lang.Class对象到方法区中,此过程由类加载器完成
  2. 类的链接:将类的二进制数据合并到JRE中
  3. 类的初始化:JVM负责对类进行初始化

加载完之后还有两步为使用卸载,就是完整的类的生命周期。

加载

将类的文件信息加载到内存中,作为程序方法入口,分三步:

  1. 通过类的全限定名获取类的二进制字节流
  2. 将字节流的静态存储结构转化为方法去的运行时结构
  3. 在内存中生成Class对象,作为方法去入口

如果被加载的是一个数组类型,数组类型是一个比较特殊的类型,他不通过类加载器加载,而是由虚拟机去完成。但是他的引用却要考加载器加载,加载器会加载完数组的数据类型后将该数组绑定到相应的加载器上,然后与该类加载器一起绑定标识唯一性。

链接

其中,类的链接可以分为以下几点:

  1. 验证:确保加载的类符合JVM规范
  2. 准备:正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配,后续初始化时会实际赋值(实例变量会被分配到堆中)
  3. 解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程)
符号引用替换为直接引用理解:

符号引用:比如一个类中引用了其它类,但是JVM不知道实际引用的其它类地址在哪,所以就会用符号引用来代表,等到解析的时候,再根据唯一符号引用去找其它类的地址。不止是其它类的代表,符号引用也可以代表方法,字段等。需要注意的是,符号引用与虚拟机布局无关,引用的目标不一定已经加载到内存中

直接引用:直接引用与虚拟机布局有关,如果使用直接引用,那么引用的目标一定已经加载到内存中

符号引用要转换成直接引用才有效,这也说明直接引用的效率要比符号引用高。那为什么要用符号引用呢?这是因为类加载之前,javac会将源代码编译成.class文件,这个时候javac是不知道被编译的类中所引用的类、方法或者变量他们的引用地址在哪里,所以只能用符号引用来表示,当然,符号引用是要遵循java虚拟机规范的。

初始化

  • 执行类构造器()方法的过程。类构造器()方法是由编译器自动收集所有类变量的赋值动作和静态代码块中的语句合并产生的。
  • 当初始化一个类的时候,会判断该类父类有没有初始化,如果没有则先触发父类的初始化
  • 虚拟机会保证一个类的()方法在多线程环境下的被正确加锁和同步

准备阶段中已经对类变量(static)进行内存分配,初始化时对类变量和静态代码块进行赋值和执行

类加载时机

  1. 创建类的实例,也就是一个new对象
  2. 访问某个类或接口的静态变量,或者对该静态变量赋值
  3. 调用类的静态方法
  4. 反射获取类信息
  5. 初始化一个类的子类(会首先初始化子类的父类)
  6. JVM启动时标明的启动类,即文件名和类名相同的那个类

类的加载机制

  1. 全盘负责:所谓全盘负责,就是当一个类加载器负责加载某个Class时,该Class所依赖和引用其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入
  2. 双亲委派:所谓的双亲委派,则是先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成类加载任务,就成功返回;只有父加载器无法完成此加载任务时,才自己去加载
  3. 缓存机制:缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜寻该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓冲区中。这就是为很么修改了Class后,必须重新启动JVM,程序所做的修改才会生效的原因

双亲委派模型

类加载器分为:启动类加载器(BootStrap ClassLoader)、扩展类加载器(Extension ClassLoader)、应用类加载器(Application ClassLoader)、自定义类加载器。

如果一个类加载器收到了一个类加载的请求,它首先不会去加载类,而是去把这个请求委派给父加载器去加载,直到顶层启动类加载器,如果父类加载不了(不在父类加载的搜索范围内),才会自己去加载。

  1. 启动类加载器:加载的是lib目录中的类加载出来,包名是java.xxx(如:java.lang.Object)
  2. 扩展类加载器:加载的是lib/ext目录下的类,包名是javax.xxx(如:javax.swing.xxx)
  3. 应用程序扩展器:这个加载器就是ClassLoader的getSystemClassLoader的返回值,这个也是默认的类加载器。

双亲委派模型的意义在于不同的类加载器之间分别负责所搜索范围内的类的加载工作,这样能保证同一个类在使用中才不会出现不相等的类。

Java 类的加载过程相关推荐

  1. Java类的加载过程详解 面试高频!!!值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话: 八小时内谋生活,八小时外谋发展. 望别日与 ...

  2. java类加载过程_面试官:java类的加载过程

    Java 类加载机制 类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段. 其中类加载过程包括加载.验证.准备.解析和初始化五个阶段. 类的加载 ...

  3. Java类的加载过程,类加载器,双亲委派原则

    Java一个类的加载过程: 1.加载 a.jvm会根据类名找到对应的类文件 b.进行文件内容读取 2.链接 链接主要是验证类中数据是否合法,然后把刚加载进来的类和其他类的关系建立清楚,主要有以下几个步 ...

  4. 描述一下JAVA的加载过程_JVM源码分析之Java类的加载过程

    简书 占小狼 转载请注明原创出处,谢谢! 趁着年轻,多学习 背景 最近对Java细节的底层实现比较感兴趣,比如Java类文件是如何加载到虚拟机的,类对象和方法是以什么数据结构存在于虚拟机中?虚方法.实 ...

  5. Trembling ! Java类的加载过程详解(加载验证准备解析初始化使用卸载)

    [1]类的生命周期 一个类从加载进内存到卸载出内存为止,一共经历7个阶段: 加载->验证->准备->解析->初始化->使用->卸载 其中,类加载包括5个阶段: 加载 ...

  6. Java类的加载过程

    文章目录 一.加载 2.类加载器 ①.启动类加载器(Bootstrap ClassLoader) ②.扩展类加载器(Extension ClassLoader) ③.应用程序类加载器(Applicat ...

  7. Java虚拟机中 类的加载过程

    Java中 类的加载过程 例如下面的一段简单的代码 public class HelloWorld {public static void main(String[] args) {System.ou ...

  8. java类的加载时机和过程

    首先,这是一个加载实例: 类什么时候被加载 其次,主要原理: http://blog.csdn.net/liang_70121385/article/details/52496028 内容如下: 1 ...

  9. 深入理解Java虚拟机二(类加载器和类的加载过程)

    类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于它是否可以运行,则由Ex ...

最新文章

  1. elf文件中的.plt .rel.dyn .rel.plt .got .got.plt的关系
  2. 帮你梳理springboot所有常用注解
  3. iOS开发拓展篇—音频处理(音乐播放器6)
  4. MySQL数据导入导出(一)
  5. C#中的修饰符及其说明
  6. Java知识积累-基础篇
  7. 免费送新款华为笔记本 ! !不爱可折现!
  8. ASP.NET在类中引用Application和Server.MapPath
  9. libreoffice python 操作word及excel文档
  10. 洛谷 题解 UVA1395 【苗条的生成树 Slim Span】
  11. java中this用法
  12. revit模型怎么在手机上看_怎么在手机上查看建筑模型图??
  13. 给系统闹钟设置时间Alarm
  14. 计算机控制中的时序,时序控制
  15. u盘插上电脑后计算机没没磁盘,U盘插上电脑没有显示“可移动磁盘”的解决
  16. SpringBoot —— 实现邮件、短信的发送功能
  17. Output Shape和Param参数解释
  18. 36线性映射03——线性空间的同构、同构的性质、线性同构
  19. OpenCV:字符分割——方向投影法
  20. cad直线和圆弧倒角不相切_CAD中圆角(fillet)与倒角(chamfer)的技巧总结

热门文章

  1. 高管 如何做一个讲师
  2. linux磁盘是vda,linux磁盘分区格式化-fdisk命令工具
  3. css常用代码大全,html+css代码
  4. python内存管理垃圾回收原理
  5. 爱情呼叫转移二(爱情左右)---记忆中的青春
  6. 爬虫实战篇---12306抢票爬虫
  7. 打造环绕智能,小度助手7.0及多款小度黑科技智品发布
  8. Word中实现固定长度的数字自动编号
  9. 浅谈电子商务的概念以及特点
  10. react native watchman 作用