虚拟机把描述类的Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

在Java语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的。

一、类的生命周期:

  类从加载到内存,直至从内存中卸载。整个生命周期如下图:

  

  其中,加载、验证、准备、初始化、和卸载这5个阶段的顺序是确定的。

二、类加载的时机:

  Java并没有规定什么时候对类进行加载,但是规定了有且只有5中情况,要对类进行加载:

  1. new实例化对象时、读取或者设置类的静态字段时,以及调用一个类的静态方法时;
  2. 使用java.lang.reflect包的方法,对类进行反射调用时;
  3. 初始化一个类,但是其父类还没有初始化时;
  4. 虚拟机启动时,要执行的主类;
  5. 动态语言支持时,java.lang.invoke.MethodHandle实例

三、类加载的时机

1. 加载

    加载阶段主要完成3件事:

    • 通过一个类的全限定名获取定义此类的二进制字节流(Class文件、zip包、网络、运行时计算)
    • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
    • 生成一个java.lang.Class对象(未规定该对象的具体存放位置,HotSpot虚拟机将Class对象存放在方法区中),作为方法区这个类的各种数据的访问入口

2. 验证

    连接阶段的第一步。

    • 文件格式验证  : 字节流是否符合Class文件格式
    • 元数据验证      :  类的元数据进行语义验证
    • 字节码验证      :
    • 符号引用验证  :

3. 准备

    连接阶段的第二步。

    为类变量分配内存,并设置类变量的初始值(一般为0,final常量会直接赋值)。

4. 解析

    连接阶段的第三步。

    虚拟机将常量池内的符号引用替换为直接引用的过程。

5. 初始化

    对类变量进行初始化,涉及到类变量的初始化顺序。

四、类加载器

  “通过一个类的全限定名来获取描述此类的二进制字节流”,实现这个动作的代码块称为“类加载器”。

1. 类与类加载器

  对于任意一个类,都由加载它的类加载器和这个类本身一同确立其唯一性。

  类与类是否相等:Class对象的equals()方法,isAssignableForm()方法,isInstance()方法,instanceof关键字判定

  类加载器的种类:

  Java虚拟机角度:启动类加载器(Bootstrap ClassLoader)、所有其他的类加载器;

  Java开发人员角度:启动类加载器、扩展类加载器、应用程序类加载器;

2. 双亲委派模型

      

  要求:除了顶层的启动类加载器之外,其余的类加载器都应当有自己的父类加载器。

  工作流程:如果一个类加载器收到了类加载的请求,首先把这个请求委派给父类去完成,最终传递给启动类加载器。只有当父类加载器无法完成这个请求时,子加载器才会尝试自己去加载。

3. 破坏双亲委派模型

  双亲委派模型经历了3次被“破坏”。

  第一次,jdk1.2之前,必须覆盖loadClass()方法,书写不规范导致不符合双亲委派模型。因此jdk1.2之后,覆盖findClass()方法即可。

  第二次,父类加载器请求子类去完成类加载。

  第三次,代码热替换、模块热部署等会出现在平级的类加载器中进行加载。

深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制的更多相关文章

  1. Java虚拟机学习笔记——JVM垃圾回收机制

    Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...

  2. 深入理解Java内存模型中的虚拟机栈

    深入理解Java内存模型中的虚拟机栈 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都会有各自的用途,以及创建和销毁的时间,有的区域会随着虚拟机进程的启 ...

  3. 《Thinking In Java》阅读笔记

    <Thinking In Java>阅读笔记 前四章:对象导论. 一切都是对象. 操作符. 控制执行流程 public在一个文件中只能有一个,可以是一个类class或者一个接口interf ...

  4. Java基础 -- 深入理解Java类型信息(Class对象)与反射机制

    一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...

  5. java中的自动拆装箱与缓存(Java核心技术阅读笔记)

    最近在读<深入理解java核心技术>,对于里面比较重要的知识点做一个记录! 众所周知,Java是一个面向对象的语言,而java中的基本数据类型却不是面向对象的!为了解决这个问题,Java为 ...

  6. JVM虚拟机内存溢出垃圾收集及类加载机制总结

    1.Java内存区域与内存溢出异常 虚拟机栈:为虚拟机执行Java方法服务 本地方法栈:为虚拟机使用到的native方法服务. Java堆:是Java虚拟机所管理的内存中最大的一块,被所有线程共享的一 ...

  7. JVM学习笔记(四):类加载机制

    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 一.类加载的时机1. 类从被加载到虚拟机内存 ...

  8. Java程序员的必备知识-类加载机制详解

    类加载器的概念 类加载器是一个用来加载类文件的类. Java源代码通过javac编译器编译成类文件.然后JVM来执行类文件中的字节码来执行程序.类加载器负责加载文件系统.网络或其他来源的类文件. JV ...

  9. 深入理解Java 虚拟机阅读笔记(一)

    1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...

随机推荐

  1. rest的Web服务端获取http请求头字段

    如上图所示 输出的i就是获取的头字段的值 (仅自己记录)

  2. 《数据结构与算法图解》 分享 pdf下载

    链接:https://pan.baidu.com/s/1gOMlwU5ucHYDVazvVMk2uw提取码:bk5x

  3. 第十二次ScrumMeeting博客

    第十二次ScrumMeeting博客 本次会议于11月30日(四)22时整在3公寓725房间召开,持续35分钟. 与会人员:刘畅.辛德泰.张安澜.赵奕.方科栋. 1. 每个人的工作(有Issue的内容 ...

  4. mongodb基本使用(三)

    MongoDB 创建数据库 语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 如果你想查看所有数据库,可以使 ...

  5. python如何与以太坊交互并将区块链信息写入SQLite

    关于区块链介绍性的研讨会通常以易于理解的点对点网络和银行分类账这类故事开头,然后直接跳到编写智能合约,这显得非常突兀.因此,想象自己走进丛林,想象以太坊区块链是一个你即将研究的奇怪生物.今天我们将观察 ...

  6. python正则表达式,以及应用[下载图片]

    regular expresion由一系列特定字符及其组合成的字符串,用来对目标字符串进行过滤操作.. re相关知识点 python正则表达式库为re,用import re导入,在然后用re.comp ...

  7. 使用sass与compass合并雪碧图(一)

    雪碧图就是很多张小图片合并成一张大图片,以减少HTTP请求,从而提升加载速度.有很多软件可以合并雪碧图,但通常不太容易维护,使用compass生成雪碧图应该算是非常方便的方法了,可以轻松的生成雪碧图, ...

  8. TeamWork#3,Week5,Scrum Meeting 11.9

    由于经验不足和储备知识不够,最近我们的项目遇到了一些技术问题,需要对项目进行重新计划.我们总结了经验教训,找出了问题所在,明确了要补充的知识,加紧学习,将会在一周之内解决相关问题. 成员 已完成 待完 ...

  9. MathExam任务一

    小学一二年级数学计算题 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 60 35 • Es ...

  10. iOS开发学习-cocoapods的配置安装

    安装coacoapods步骤: 在终端输入如下命令,升级ruby版本: sudo gem update —system 出现这个,标志着安装成功. 完成之后,再输入如下命令: gem sources ...