C/C++在编译时需要进行连接,而Java的类加载、连接和初始化是在运行时完成的。 

     图  类的生命周期

  图中解析的过程不一定在准备和初始化之间,也可以在初始化之后再开始,以支持Java的运行时动态绑定。

一、类加载过程

  1、加载

    加载是整个“类加载”过程的第一个阶段。这一步也叫“加载”,可以理解为把类从文件中读取到内存中并按一定数据结构保存以备后续使用。

    主要分为三个步骤:

      ①通过类的全限定名获取其字节码。

      ②将字节码中的静态存储结构转换成方法区的运行时数据结构。

      ③在内存中创建一个代表这个类的java.lang.Class对象,作为该类的元数据访问入口。那么你现在知道了反射的时候,someClass.class这个对象是怎么来的了吧?只要拿到这个class你想创建实例、调用方法都行,想干哈就干哈。

    数组的加载有所不同,因为数组本身是VM自己创建的,但数组中的元素类型可能是类,还是要靠类加载器去加载。所以数组的加载分两种情况:

      ①当数组的类型是引用类型,那就递归按照上面的方法加载。

      ②当数组的类型是基本数据类型如int [],则VM将会将该数组标记为与Bootstrap加载器关联。

  2、验证

    验证的目的是确保当前字节码文件中的内容,符合当前VM的要求,不会给VM运行造成危害。

    验证过程包括:文件格式验证、元数据验证、字节码验证和符号引用验证。 

    这一步作用类似于语法检查。因为字节码的编译是在JVM之外进行的(可能来自本地jar包甚至网络),不同版本的编译器生成不同版本规范的字节码,可能带来兼容性问题。另外,也能防范恶意的字节码修改影响虚拟机的运行稳定。   

  3、准备

    这个过程主要是为类变量分配内存(分配在方法区中)并赋默认初值(如int的初值为0,char为'\u0000')。

  4、解析

    解析是将常量池内的符号引用替换为直接引用的过程。

  5、初始化

    初始化就是执行构造方法的过程。

♣所以你应该知道了成员变量初始化时刻有两次

  一次是在类加载的准备过程中、然后就是在调用构造方法的时候。

二、类加载器

  类加载器有各自的类名称空间,两个类加载器即使加载了同一个.class文件,生成的类被认为是不同的类。这也可以理解,它们在方法区本来保存的就是两份。

  1、类加载器分类

  

  2、双亲委派模型

    双亲委派的流程就是甩锅的过程。Bootstrap是顶层Loader,UserDef是底层Loader。底层Loader在接到类加载指令时啥也不干,把锅直接甩给上一层Loader,依次类推

  直到锅甩到Bootstrap(也就是说所有的锅都会到它这儿)。如果Bootstrap的路径里有这个类,算它倒霉它加载,否则它再把锅弹回给下一层Loader—Extension,如果

  Extension的类路径里有这个类,它加载。依次类推。。。

    双亲委派模型的好处是:它的这种上层优先的层级关系保证了,类加载的有序性,不会因为各路Loader自行加载导致的混乱。

PS:Tomcat的类加载机制

  https://blog.csdn.net/varyall/article/details/81610620  

【Java】「深入理解Java虚拟机」学习笔记(5)- 类加载的更多相关文章

  1. 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势

    0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...

  2. 《深入理解Java虚拟机》学习笔记之类加载

    之前在学习ASM时做了一篇笔记<Java字节码操纵框架ASM小试>,笔记里对类文件结构做了简介,这里我们来回顾一下. Class类文件结构 在Java发展之初设计者们发布规范文档时就刻意把 ...

  3. (转)《深入理解java虚拟机》学习笔记6——类加载机制

    Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需要完成以下 ...

  4. 【Java】「深入理解Java虚拟机」学习笔记(4)- 类文件结构

    我为什么喜欢Java,另一个重要原因就是跨平台,WORA. 程序员是爽了,但肯定有人要为你遮风挡雨,解决WORA的基石就是字节码+虚拟机. ♣Tip 其实这里存在两种无关性,一是平台无关性.另一个是语 ...

  5. 【Java】「深入理解Java虚拟机」学习笔记(2)- JVM内存区域

    一.运行时数据区 JVM在执行Java程序的时候,将其运行时数据区划分为若干不同区域.它们的用途和创建及销毁的时间不同. 1.程序计数器(Program Counter Register) 是一块很小 ...

  6. 「中国剩余定理CRT」学习笔记

    设正整数$m_1, m_2, ... , m_r$两两互素,对于同余方程组 $x ≡ a_1 \ (mod \ m_1)$ $x ≡ a_2 \ (mod \ m_2)$ $...$ $x ≡ a_r ...

  7. Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)

    Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...

  8. Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)

    Java虚拟机内存溢出异常--<深入理解Java虚拟机>学习笔记及个人理解(三) 书上P39 1. 堆内存溢出 不断地创建对象, 而且保证创建的这些对象不会被回收即可(让GC Root可达 ...

  9. 《深入理解Java虚拟机》学习笔记

    <深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...

随机推荐

  1. 【MySQL 读书笔记】RR(REPEATABLE-READ)事务隔离详解

    这篇我觉得有点难度,我会更慢的更详细的分析一些 case . MySQL 的默认事务隔离级别和其他几个主流数据库隔离级别不同,他的事务隔离级别是 RR(REPEATABLE-READ) 其他的主流数据 ...

  2. Java 写 Log

    . 一个最基本的例子 使用Logging框架写Log基本上就三个步骤 引入loggerg类和logger工厂类 声明logger 记录日志 下面看一个例子 //1. 引入slf4j接口的Logger和 ...

  3. vue打包静态资源路径不正确的解决办法【转】

    vue项目完成打包上线的时候很多人都会碰到静态资源找不到的问题,常见的有两个 1.js,css路径不对 解决办法:打开config/index.js,将其中的assetsPublicPath值改为’. ...

  4. 洛谷P1197 [JSOI2008]星球大战

    题目 由于题目不要求强制在线,所以可以离线. 而离线的话就会带来许多便利,所以我们可以先处理出全部打击后的图,通过并查集来判断是否连通. 然后再从后往前枚举,得出答案 #include <bit ...

  5. python高级编程和算法

    import copy #a = ("a","b","c") #a = ["a","b"," ...

  6. The King’s Problem HDU - 3861(连通图 缩点 匹配)

    在一个王国里面, 国王有一个新的问题. 皇城中有N个城市M条单行路,为了让他的王国更加高效,国王想要将他的王国划分成几个州,每个城市必须属于一个州.对于两个城市(u,v),必须满足以下3个条件:   ...

  7. Nginx-动态添加模块

    Nginx动态添加模块 平滑升级 已经安装好的Nginx动态添加模块 说明: 已经安装好的Nginx,需要添加一个未被编译安装的模块,需要怎么弄呢? 这里已安装第三方nginx-rtmp-module ...

  8. linux 单用户密码修改

    1.启动系统,并在GRUB2启动屏显时,按下e键进入编辑模式. 2.在linux16/inux/linuxef所在参数行ro更改为init=/sysroot/bin/sh 3.按Crl+x启动到she ...

  9. POJ 3666 Making the Grade (动态规划)

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...

  10. [源码分析]StringBuffer

    [源码分析]StringBuffer StringBuffer是继承自AbstractStringBuilder的. 这里附上另外两篇文章的连接: AbstractStringBuilder : ht ...