虚拟机把描述类的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. CI/CD系列

    一.CI/CD系列 什么是CI/CD(译) Docker与CI/CD(转) Docker和CI/CD实战 二.Git 三.GitLab

  2. python+appium 实现qq聊天的消息,滑动删除聊天消息

    有人问我,appium怎么去删除qq聊天的, 当时想到的是滑动, 可是具体的大概有个思路,于是乎,就想自己来实现下, 打开模拟器,开发者选项,找到显示坐标的 然后去打开qq获取要删除的消息的坐标后, ...

  3. 自己编写的:centos6.6上编译安装apache2.4+php5.6+mysql5.6【亲自】

    在centos6.6上安装apache2.4+php5.6+mysql5.6 关于wget的安装 将之前装系统的.iso文件挂载到光驱 由于我在/home/jinnan/下建立了一个cdrom文件夹 ...

  4. Unity中容易被忽略的小技巧

    今天在游戏蛮牛上看到慕容小匹夫的一篇文章,感觉对自己现在的水平很实用,就给转载了过来,以便日后好温习一下. 这里还是要支持原创作者,原文地址在这里 一.编辑器染色 一个常见的工作情景是我们在调整场景内 ...

  5. MyCat安装与测试教程 超详细!

    MyCat安装与测试教程 超详细! MyCat基础知识 一.什么是MYCAT? 1. 一个彻底开源的,面向企业应用开发的大数据库集群 2. 支持事务.ACID.可以替代MySQL的加强版数据库 3. ...

  6. 【RL系列】马尔可夫决策过程——状态价值评价与动作价值评价

    请先阅读上两篇文章: [RL系列]马尔可夫决策过程中状态价值函数的一般形式 [RL系列]马尔可夫决策过程与动态编程 状态价值函数,顾名思义,就是用于状态价值评价(SVE)的.典型的问题有“格子世界(G ...

  7. 满帮集团CEO:未来将向“智慧型”公司转变,要成为一家生态公司

    谁都想成为下一个滴滴.显然,王刚也希望在物流业,货车帮与运满满在合并后,能够企及滴滴的高度. 货车帮与运满满,都曾是货运物流领域的翘楚,也因为业务的竞争关系有过水火不容厮杀.但最终还是在资本与地方政府 ...

  8. host命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/xin_y/article/details/53924763 分析域名查询工具,测试域名系统工作是否正常 语法: host ...

  9. 20172319 实验三 《敏捷开发与XP实践》 实验报告

    20172319 2018.05.17-30 实验三 <敏捷开发与XP实践> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1723班 学生姓名:唐才铭 学生学号:20 ...

  10. 什么是REST编程

    参考:什么是REST编程:http://www.ruanyifeng.com/blog/2011/09/restful.html 一.REST是Representational State Trans ...