一、类加载机制概述

  虚拟机把描述类的数据从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. oracle执行sql文件

    oracle执行sql文件 在PL/SQL中直接用command window执行就可以了: PL/SQL developer----->File------>New---->com ...

  2. centos7 二进制安装MySQL5.7.22

    1.详细描安装的过程 1.1关闭防火墙 systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service ...

  3. 11 MySQL--Navicat与pymysql模块

    1.Navicat的安装下载 一.Navicat 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时, 可以使用可视化工具Navicat,以图形界面的形式操作My ...

  4. Angular2中Input和Output

    @Input @Input是用来定义模块的输入的,用来让父模块往子模块传递内容: @Output 子模块自定义一些event传递给父模块用@Output. 对于angular2中的Input和Outp ...

  5. spring mvc请求参数中文乱码解决方案

    POST 请求 在web.xml中加上增加过滤器 <filter> <filter-name>encodingFilter</filter-name> <fi ...

  6. k8s gpu 资源设置

    将所有相同型号显卡的node打上 相同的label kubectl label node ogs-gpu02 gpu_type=k20m 启动device plugin 和app 时: nodeSel ...

  7. python实现测试报告的bug统计

    背景:组内要针对每个项目生成测试报告,要对当前项目的一些bug进行统计.考虑到人工统计比较繁琐,而且是个长期的工作,所以写个脚本对bug进行自动统计.(我们用的bug平台是bugfree,直接可以导出 ...

  8. 【读书笔记】《Python_Cookbook3》第一章:数据结构和算法

      Python提供了多样化有用的内建数据结构,例如列表.集合.字典.大多数时候,这些结构的使用比较简单,然后,一些关于搜索.排序.过滤的常见问题经常出现.本章节的目标是讨论常见的数据结构,以及涉及到 ...

  9. ArcEngine调用FeatureToLine工具传参问题

    FeatureToLine工具的in_features参数不能为内存图层,否则会报内存错误,正确的写法如下: FeatureToLine ftrToLine = new FeatureToLine() ...

  10. UNITY5 - fog

    全局雾效在 window->lighting 的设置,可设置颜色和距离 注意摄像机的Rendering Path要选择Forward