我们都知道以 .java 结尾的 Java 源文件,经过编译之后会变成 .class 结尾的字节码文件。JVM 通过类加载器来加载字节码文件,然后再执行程序。

什么时候加载一个类

那么,什么时候类加载器会加载一个类呢?用到这个类的时候,JVM的类加载器就会加载这个类。用到这两个字说起来很抽象,我用代码和图例来说明。

有下面这样一段代码,一个类EmergencyPlan,里面有一个main()函数,main()函数做的事情是创建了一个 Account 对象。

public class EmergencyPlan {public static void main(String[] args) {Account account = new Account();}
}

我们应该知道运行 JVM 就相当于启动了一个 Java 的进程,它会从程序的主函数,即main()函数开始执行。所以类加载的步骤是这样的:

  1. 先加载主函数所在的类EmergencyPlan
  2. 由于EmergencyPlan使用了Account,所以继续加载Account

准备和初始化的区别

类加载机制总共有这样7个步骤:加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载。接下来先把每个阶段在做什么讲一下,再着重对比一下准备阶段和初始化阶段。

  • 验证阶段:验证字节码文件是否符合JVM的规范。这挺好理解,万一字节码文件被修改过,JVM压根无法执行咋办。所以加载之后先验证一下。
  • 准备阶段:为类分配内存空间,为变量赋初值。
  • 解析阶段:符号引用替换为直接引用。
  • 初始化阶段:执行初始化代码,new对象;执行static代码块;父类没有初始化要先初始化父类。

用代码和画图来说明一下准备阶段和初始化阶段。

public class EmergencyPlan {public static int id= Configuration.getInt("plan_id");
}

这段代码说的是EmergencyPlan这个类有一个变量id,通过getInt()为其赋值:

  • 准备阶段会为id开辟一个内存空间,但不会执行赋值操作,仅仅是赋予一个初值0。
  • 初始化阶段才会执行getInt()为变量id初始化值。

类加载的过程就变成了下图所示的样子:

类加载器和双亲委派模型

JVM进行类加载是通过类加载器完成,类加载器是一种亲子层级结构的模型。Java里面的类加载器有这样几种:

  • 启动类加载器。加载 JDK 中 lib 目录中 Java 的核心类库,即$JAVA_HOME/lib目录。
  • 扩展类加载器。加载 lib/ext 目录下的类。
  • 应用程序类加载器。加载我们写的应用程序。
  • 自定义类加载器。根据自己的需求定制类加载器。

那什么是双亲委派模型呢?类加载器是一种亲自层级结构,就像下图所示:

比如要加载上面的EmergencyPlan类,应用程序类加载器会先问它的父亲扩展类加载器,你能帮我加载么?扩展类加载器会再问它的父亲启动类加载器,你能帮我加载么?

显然EmergencyPlan是一个应用程序类。启动类加载器会告诉扩展类加载器,你自己去加载;扩展类加载器就会告诉应该程序类加载器,你自己去加载。最后,应用程序类加载器就自己加载了EmergencyPlan

流程图总结

最后来在类加载的流程图上,把双亲委派模型也添加上去。

双亲委托类加载机制_图解JVM类加载机制和双亲委派模型相关推荐

  1. jvm类加载机制和类加载器_在JVM之下–类加载器

    jvm类加载机制和类加载器 在许多开发人员中,类加载器是Java语言的底层,并且经常被忽略. 在ZeroTurnaround上 ,我们的开发人员必须生活,呼吸,饮食,喝酒,并且几乎与类加载器保持亲密关 ...

  2. 工作中用到的java反射机制_(转)JAVA-反射机制的使用

    Java反射机制的实现原理 反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠 ...

  3. 建立完善的员工晋升机制_【员工晋升机制】多渠道员工晋升机制如何建立

    北京华恒智信人力资源顾问有限公司 [员工晋升机制]多渠道员工晋升机制如何建立 引言: 员工晋升机制是员工由较低层级职位上升到较高层级职位的过程, 合理的员工晋 升机制可以实现良好的资源配置, 使合适的 ...

  4. jvm垃圾回收机制_干货|JVM垃圾回收机制

    前言 不同于C++程序员必须自己完成内存的分配.使用和释放,JAVA语言提供了垃圾回收机制(GC,Garbage Collection),所以JAVA程序员仅需要负责分配和使用内存即可,而释放内存则由 ...

  5. delphi报列表索引越界怎么处理_图解Elasticsearch索引机制,此篇带你领悟新世界...

    前言 随着Elastic的上市,ELK不仅在互联网大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连"婚庆网站"都开始使用Elasticsearch了.随之而来的 ...

  6. java提供两种处理异常的机制_浅析Java异常处理机制

    关于异常处理的文章已有相当的篇幅,本文简单总结了Java的异常处理机制,并结合代码分析了一些异常处理的最佳实践,对异常的性能开销进行了简单分析. 博客另一篇文章<[译]Java异常处理的最佳实践 ...

  7. java线程锁机制_多线程之锁机制

    前言 在Java并发编程实战,会经常遇到多个线程访问同一个资源的情况,这个时候就需要维护数据的一致性,否则会出现各种数据错误,其中一种同步方式就是利用Synchronized关键字执行锁机制,锁机制是 ...

  8. attention机制_简析Attention机制—优缺点,实现,应用

    什么是Attention机制? Attention机制的本质来自于人类视觉注意力机制.人们在看东西的时候一般不会从到头看到尾全部都看,往往只会根据需求观察注意特定的一部分. 简单来说,就是一种权重参数 ...

  9. 简述java的异常处理机制_简述java异常处理机制

    引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...

最新文章

  1. vue面向切面_vue:在路由跳转中使用拦截器
  2. linux下安装 QQ(wine qq 2013-2014)
  3. c语言while计算机编写,计算机等级考试二级C语言(while与dowhile循环)
  4. Mars 如何分布式地执行
  5. java的基础语法和数据类型,IDEA
  6. c++ for each 遍历tuple
  7. 集成 websocket 的四种方案
  8. python 计算机基础
  9. Django 上传附件报The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS错误
  10. jquery 背景特效实现_html5实现的仿网页版微信聊天界面效果源码
  11. git上传过滤忽略文件
  12. 计算机usb连接外设后不能启动,usb连接电脑没反应解决方法
  13. Python基本数据类型字符串操作总结
  14. keep-alive和activated
  15. BZOJ1777: [Usaco2010 Hol]rocks 石头木头
  16. 微信公众号开发:用从微信服务器下载图片资源
  17. 贪婪算法————背包问题
  18. C++Primer第五版——习题答案详解(六)
  19. 培训机构无线覆盖解决方案
  20. mysql如何给表加密_sql怎么加密表

热门文章

  1. 最经典的权限设计同样也是最糟糕的权限设计,权限设计理念最关键第一步之间的PK...
  2. 《赢道——成功创业者的28条戒律》2009年1月出版
  3. [最小割] Luogu P4662 黑手党
  4. photoshop改变图片大小,不改变像素
  5. git clone错误
  6. ACM题目————中位数
  7. [转]谈谈团队的凝聚力
  8. 5)Javascript设计模式:extends模式
  9. SQLserver通过链接服务器连接oracle
  10. Ibatis ISqlMapper工厂类案例