一、类加载机制概述

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

二、类加载的机制

  类加载的过程一共是5个步骤:加载、连接、初始、使用、卸载,其中连接过程中又会进行验证、准备、解析的工作,具体如下:

    

  需要注意的是:

  1.类的加载策略采用的是懒加载。

  2.在类加载开始后,才会进行连接。

  3.只有以下情况才会初始化类:

    a.new实例化的类会对该类进行初始化。

    b.读取或设置类静态字段的时候(但被final修饰的字段,在编译器时就被放入常量池的静态字段除外static final)。

    c.调用类静态方法的时候。

    e.使用反射对类进行反射调用的时候。

    f.当一个类初始化时,要先对其父类进行初始化。

    g.主类或启动类(main)。

    h.当使用JDK1.7的动态语言支持时,如果一个java.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。

三、加载

  1.加载的过程

    1)通过一个类的全限定名类获取定义此类的二进制类。

    2)将这个字节流所代码的静态存储结构转化为方法区的运行时数据结构。

    3)在内存中生成一个代表这个类的class对象,作为这个类的各种数据的访问入口。

   2.加载源

    由于类的加载本质就是加载二进制流,这个二进制流的来源没有一个固定的规则,所以它可以来自多个地方:

    1)文件,如:class文件,jar包

    2)网络

    3)计算机生成一个二进制流,如:网络代理($proxy),反射包

    4)由其他文件生成,如:JSP

    5)数据库

 四、连接

  1.验证

    验证是连接的第一步,这一阶段的目的是为了确保class文件的字节流中包含的信息符合当前虚拟机的要求,而且不会危害虚拟机自身的安全。

     验证的方式主要有:

      1)文件格式验证;

      2)元数据验证;

      3)字节码验证;

      4)符合引用验证。

  2.准备

    准备阶段正式为类变量分配内存并设置变量的初始值。这些变量使用的内存都将在方法区中进行分配。

    需要注意的是:这里的初始值并非我们指定的值,而是数据类型的默认值,如:int类型的默认值为0;float类型的默认值为0.0

    但是如果被final修饰,那么这个过程中,常量值会被一同指定。

  3.解析

    解析阶段是虚拟机将常量池中的符号引用替换为直接引用的过程,主要分为以下几类:

      1)类或者接口解析

      2)字段解析

      3)类方法解析

      4)接口方法解析

五、初始化

  初始化是类加载的最后一步,简单的说,类的初始化就是执行<clinit>方法的过程,类的初始化主要以下几种情况:

  1.子类的<clinit>在执行之前,虚拟机保证父类的<clinit>方法先执行完毕。

  2.接口中有变量要赋值,也会生成<clinit>,但不需要先执行父接口的<clinit>方法,只有父接口中定义的变量使用时才会初始化

  3.如果多个线程同时初始化一个类,那么只有一个线程会执行这个类的<clinit>方法,其他线程等待执行完毕。如果方法执行时间过长,那么就会造成多个线程阻塞。由此我们就可以知道线程阻塞可能会出现的原因:线程执行类初始化时死掉了。

  4.<clinit>方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序是有语句在源文件中出现的顺序决定的。静态语句块中只能访问定义在静态语句块之前的变量,定义在它之后的变量,在前面的语句中赋值,但是不能访问。

深入了解java虚拟机(JVM) 第十一章 类的加载的更多相关文章

  1. JVM虚拟机系列(一)类的加载

    JAVA虚拟机系列(一) 类的加载 目录 1 类的初始化过程 2 详解初始化时的各个阶段 一.类初始化的过程 先来看一个CLASS文件在整体生命周期里会遇到的阶段: xxxx.class ---> ...

  2. JVM详解之:类的加载链接和初始化

    目录 简介 加载 运行时常量池 类加载器 链接 验证 准备 解析 初始化 总结 简介 有了java class文件之后,为了让class文件转换成为JVM可以真正运行的结构,需要经历加载,链接和初始化 ...

  3. 【转】怎么解决java.lang.NoClassDefFoundError错误 ,以及类的加载机制

    转自http://blog.csdn.net/jamesjxin/article/details/46606307 前言 在日常Java开发中,我们经常碰到java.lang.NoClassDefFo ...

  4. 《深入理解Java虚拟机》-----第6章 类文件结构——Java高级开发必须懂的

    代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 6.1 概述 记得在第一节计算机程序课上我的老师就讲过:“计算机只认识0和1,所以我们写的程序需要经编译器翻 ...

  5. 《深入理解java虚拟机》第六章 类文件结构

    第六章 类文件结构   6.2 无关性的基石 各种不同平台的虚拟机与所有的平台都统一使用的程序存储格式--字节码(ByteCode)是构成平台无关性的基石.java虚拟机不和包括java在内的任何语言 ...

  6. (六)《Java编程思想》——初始化及类的加载顺序

    package chapter7; /** * 初始化及类的加载顺序:顺序如下 * 1.基类的static变量 * 2.导出类的static变量 * 3.基类的变量 * 4.基类的构造函数 * 5.导 ...

  7. Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...

  8. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  9. 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

    目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...

随机推荐

  1. clr相关名词

    程序集:一个或多个类型定义文件和资源文件的集合 Native Code(本机代码): 已被编译为特定于处理器的机器码的代码. 本地代码(native code)是计算机编程(代码),编译用来运行一个特 ...

  2. S 导员工信息

    EXCEL模板 [Public] ConnectString=host="siebel://10.10.1.174:2321/SBA_NR_DEV/SMObjMgr_chs ConnectU ...

  3. Qt Font

    Font and How to use TTF字体基本知识及其在QT中的应用 Qt为程序添加外部字体 在使用qt 添加第三方字体的时候,在程序开始的时候,使用·QFontDatabse·的静态函数加载 ...

  4. Associate File Type with Qt In Mac Os and Win

    Win Registry Question One day, my boss want me to finish one function which let the users can double ...

  5. MyBatis 实用篇(一)入门

    MyBatis 实用篇(一)入门 MyBatis(http://www.mybatis.org/mybatis-3/zh/index.html) 是一款优秀的持久层框架,它支持定制化 SQL.存储过程 ...

  6. sql查询磁盘空间并发预警邮件

    检测磁盘空间,如果低于设置的预警值则发出一封预警邮件,这样的事情可以用SQL server的作业可以做,关键SQL语句如下例子所示: DECLARE @TableText NVARCHAR(MAX)= ...

  7. 2016年,你读过的最好的IT技术书有哪几本?

    def 程序员 原文 https://www.zhihu.com/question/54350343 陈硕 等 54 人赞同了该回答 1 知乎 陈硕大牛的 服务器多线程编程muduo 输的好不好可能更 ...

  8. BI失败的原因

    最最重要的, 要有个清晰的目标和范围. 有些客户, 完全脑袋一热开始上BI, 连根本上要BI来解决什么问题都不知道.作为企业的CIO, 首先要知道上BI项目是不是符合企业的战略目标, 是不是能给企业带 ...

  9. 用word2016 写CSDN 博客

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  10. linux每天一小步---cat命令详解

    1 命令功能 cat命令是linux系统下的一个文本输出命令,通常用于查看文件的内容. 2 命令语法 cat  [选项参数]  文件名 3 命令参数 -n  由1开始对所有输出的内容行数编号 -b   ...