首先类加载在整个体系结构的哪一个环节呢?见红色圈住的部分。

类加载器分为那几个过程呢?五个过程

  • 加载

    • 根据类的全限定名(简单理解为类的绝对路径,见附录),找到指定的字节码文件,并在内存中生产一个java.lang.Class的对象,存放在方法区中。
  • 验证

    • 作用:确保字节码文件中包含的信息符合Class文件格式规范,对虚拟机来说是安全的。
    • 规则一直在更新,大体有四种
      • 文件格式验证

        • 基于二进制字节流进行分析。
      • 元数据验证(可以理解成是对类层面的信息验证)
        • 对类的元数据进行语义分析。
      • 字节码验证(对方法层面的信息验证)
        • 对方法体语义分析。
      • 符号引用验证
        • 验证根据引用能否找到对应的类、方法、字段。
    • 如果确认字节码文件是安全的,通过 -Xverify:none 关闭大部分验证。
  • 准备

    • 在方法区中为类的静态变量分配内存并初始化。
  • 解析

    • 将常量池中的符号引用替换为直接引用的过程。
  • 初始化

    • 执行类构造器<client>方法,<client>方法是由编译器自动收集的类中的类变量赋值操作和静态语句块中的语句。并且会保证父类的<client>方法先执行。

加载过程由谁来执行的

类加载器 classLoader,也就是 Java.lang.ClassLoader。核心函数是loadClass

protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException {
// 首先检查类是不是已经被加载
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
//如果父类不为空,优先检查父类的
c = parent.loadClass(name, false);
} else {
//否则检查当前的
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// 如果还是找不到,就触发子类本身的findClass方法去找
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}

那类加载器有哪几种

两大类,四小种:JDK默认提供的三种,用户自定义的一种。

默认的三种有(非继承关系)

  • Bootstrap ClassLoader 启动类加载器,没有父类。

    • 一般是native code(C++)实现
    • 用于加载虚拟机的核心类(<JAVA_HOME>/jre/lib/rt.jar),包括扩展类/系统类加载器
  • Extension ClassLoader 扩展类加载器,父类加载器为空

    • java实现,是rt.jar中sun.misc.Launcher的内部类sun.misc.Launcher$ExtClassLoader (miscellaneous)
    • 用于加载扩展库中的类(<JAVA_HOME>/jre/lib/ext)
  • System ClassLoder 父类加载器Ext ClassLoader

    • java实现,是rt.jar中sun.misc.Launcher的内部类sun.misc.Launcher$AppClassLoader
    • 用于CLASS_PATH中的类

用户自定义的有一种 父类是 System ClassLoader

  • 继承自java.lang.ClassLoader

这么多加载器,如果我两个加载器中有同名文件怎么办?

这里有一个双亲委派的概念。就是当查找一个类的时候,会一层一层的向上委托查询,如果父类加载器有对应的类,就直接从父类加载该类。

这样的双亲委派有好处,但是有些场景我们是希望破坏双亲委派的

  • 场景一:我们想在顶层的classLoader中加载底层的classLoader

    • 可以在线程中放入底层的classLoader到Thread.setContextClassLoader()中,然后在顶层的classLoader中使用Thread.getContextClassLoader()加载第三方的classLoader实现。
  • 场景二:实现类热部署

    • 一个class只能被一个classLoader加载一次,当需要实现代码热部署的时候可以每次都new一个自定义的classLoader来加载新的Class文件。
  • 场景三:Tomcat中使用WebAppClassLoader进行单独加载,加载不了再去委托父加载器去加载。

附录

  • 类的全限定名:可以理解成类的绝对路径,一般规则是包名.外部类名$内部类名。

    • 成员内部类:包名.外部类名$内部类名
    • 匿名内部类:包名.外部类名$由1开始的正整数-按照类装载顺序依次排列
    • 局部内部类:包名.外部类名$由1开始的正整数后跟局部类名-其中数字部分是局部类在外部类上下文出现的先后顺序

JVM类加载机制概述的更多相关文章

  1. 一夜搞懂 | JVM 类加载机制

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图 一.为什么要学习类加载机制? 今天想跟大家唠嗑唠嗑Java的类加载机制,这是Java的一个很重要的创 ...

  2. JVM基础系列第7讲:JVM 类加载机制

    当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...

  3. JVM总结(四):JVM类加载机制

    这一节我们来总结一下JVM类加载机制.具体目录如下: 类加载的过程 类加载过程概括 说说引用 详解类加载全过程: 加载 验证 准备 解析 初始化 虚拟机把描述类的数据从Class文件加载到内存,并对数 ...

  4. JVM 类加载机制详解

    如下图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lan ...

  5. Java虚拟机(四):JVM类加载机制

    1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...

  6. JVM类加载机制详解(二)类加载器与双亲委派模型

    在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有: 1.通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件).而获取的方式,可 ...

  7. JVM类加载机制(转)

    原文出自:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运 ...

  8. JVM类加载机制详解

    引言 如下图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 加载 在加载阶段,虚拟机需要完成以下三件事情: 1)通过一个类的全限定名来获取定义此 ...

  9. Android动态加载--JVM 类加载机制

    动态加载,本质上是通过JVM类加载机制将插件模块加载到宿主apk中,并通过android的相关运行机制,实现插件apk的运行.因此熟悉JVM类加载的机制非常重要. 类加载机制:虚拟机把描述类的数据从C ...

随机推荐

  1. Asp.Net MVC 开发技巧(一)

    开发程序时的流程: 1.设计数据模型. 数据模型最为重要,不仅关系到数据的存储,同时程序的可扩展性,效率也受影响,甚至决定开发工作量.所以要极其认真的设计数据库的表和相关字段. 建完基本的数据模型后, ...

  2. Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.

    System.Data.OracleClient 已经过时了.微软不再支持它. 因此,我建议你为. NET 使用Oracle数据提供程序:ODP.Net. 你可以从以下位置下载: 版本:Release ...

  3. Oracle手工修改JOB属性

    以下由sqlplus 来执行,具体参照一下相关的文档VARIABLE jobno number;BEGINDBMS_JOB.SUBMIT(:jobno,’p_test;’SYSDATE,’SYSDAT ...

  4. 深入浅出SharePoint2013——常用术语

    CAS(Code Access Security)自定义代码访问安全性 Sandboxed solution 沙箱解决方案

  5. ZT I Believe I Can Fly(我相信我能飞)

    I Believe I Can Fly(我相信我能飞) 歌手:R. Kelly(罗 凯利) 歌词部分 I used to think that I could not go on 我原以为我无法坚持下 ...

  6. HTTP协议图--HTTP 报文首部之首部字段(重点分析)

    1.首部字段概述 先来回顾一下首部字段在报文的位置,HTTP 报文包含报文首部和报文主体,报文首部包含请求行(或状态行)和首部字段. 在报文众多的字段当中,HTTP 首部字段包含的信息最为丰富.首部字 ...

  7. 美团2018年CodeM大赛-初赛B轮 B 配送(最短路)

    美团2018年CodeM大赛-初赛B轮 B 配送 题意 题解 对于每个任务,只要从上个任务的终点出发即可. 时间.地点很少,可以算出每个地点-时间的最小花费. 以题目描述的起点终点起始结束时间建图,很 ...

  8. SAP ABAP里数据库表的Storage Parameters从哪里来的

    如何查看ABAP数据库表的storage parameter? 事务码SE11,utilities->Database Object->Database Utility: 点这个Stora ...

  9. Python条件判断if、for、while

    if条件判断 if 条件判断: 逻辑操作...... ...... 判断字符串是否为空 if a.strip(): #表示字符串不为空 pass 判断是否为字典 d = dict(a=1) if is ...

  10. mavenWeb工程建立步骤

    1.File >> New >>other...,在New窗口中打开Maven,选中Maven Project,Next. 2.在New Maven Project弹出窗口中去 ...