第7章 虚拟机类加载机制

类的加载的时机

加载 Loading, 连接 Linking(验证 Verfiication, 准备Preparation, 解析 Resolution) 初始化 Initialization, 使用Using和卸载 Unloading

类加载的过程:

1,加载:

  加载是“类加载" class loading过程珠一个阶段,在加载阶段,虚拟机需要完成以下3个事情。

    1 通过一个类的全限定名来获取定义此类的二进制字节流

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

    3 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

2、验证

  1 文件格式验证:验证字节流是否符事Class文件格式的规范,并且能被当前版本的虚拟机处理。

  2元数据验证:对字节码描述的信息进行语义分析。 这个类是否有父类,是否继承了不允许被继承的类。。。。

  3 字节码验证:主要目的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。在第二阶段对元数据信息中的数据类型做完校验后,这个阶段将对类的方法体进行校验分析,保证被校验类的方法在运行时不会做出危害虚拟机安全的事件。保证任意时刻操作数栈的数据类型与指令代码序列都能配合工作,例如不会出现类似这样的情况,在操作栈放置了一个int类型的数据,使用时却按long类型来加载入本地变量表中。

  4 符号引用验证 最后一阶段的校验发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作将在连接的第三阶段--解析阶段中发生。符号引用验证可以看做是对类自身以外的信息进行匹配性校验。 符号引用中通过字条串描述的全限定名是否能找到对应的类;在指定类中是否存在符合方法的字段描述符以及简单名称所描述的方法和字段............

3、准备

  准备阶段是正式为类变量分配内存并设置类变量初始值的阶段。对于非静态的变量,则不会为它们分配内存。

  数据类型的初始值: int, byte, char, long, float, double默认初始值为0; boolean为false;reference为null.

  对于常量属性(public static final int value=23),在准备阶段直接赋值23.

4、解析

  解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。符号引用就是class格式中的CONSTANT_Class_info, CONSTANT_Fieldref_info, CONSTANT_Methodref_info及 CONSTANT_InterfaceMethodref_info的常量,直接引用就是直接指向目录的指针、相对偏移量或一个间接前两位到目标的句柄。有类或接口的解析,字段解析,类方法解析,接口方法解析。

5、初始化

  是初始化类变量和其他资源,这里将执行用户的static字段和静态语句块的赋值操作。这个过程执行类构造器<clinit>()方法的过程。

  <clinit>()是邮编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的。

  1)如果类存在父类,并且父类没有被初始化则先对直接父类进行初始化(执行父类的<clinit>()).

  2)如果类妆前存在<clinit>()方法,则执行<clinit>()方法。

  接口interface不能用static块

类加载器

  启动类加载器 Bootstrap ClassLoader,主要负责加载java_home/lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且可以是被拟机识别的类库到虚拟机内存中。

  扩展类加载器 Extension ClassLoader:这个加载器由sun.misc.Launcher$ExtClassLoader实现,负责加载java_home/lib/ext目录中,或者被java.ext.dirs系统变量所指定的路径中的类库

  应用程序类加载器 Application ClassLoader:也叫系统类加载器。这个类加载器由sun.misc.Launcher$App-ClassLoader实现,主要负责加载classPath路径上的类库,如果应用程序没有自定义自己类加载器,则这个就是默认的类加载器。

  这三类加载器,不是父子关系,而是采用组合方式。正常情况下,每个类加在收到类加载请求时,会先调用父加载器进行加载,若父加载器加载失败,则子加载器进行加载。只有父加载器不能加载该类时才会调用子加载器。

  如需要加载java.lang.Object类时,不论使用哪个类加载器来加载,会找到根classLoader来加载该类。

深入理解java虚拟机-第七章的更多相关文章

  1. 深入理解java虚拟机-第13章-线程安全与锁优化

    第十三章 线程安全与锁优化 线程安全 java语言中的线程安全 1 不可变.Immutable 的对象一定是线程安全的 2 绝对线程安全 一个类要达到不管运行时环境如何,调用者都不需要额外的同步措施, ...

  2. 深入理解java虚拟机-第六章

    第6章 类文件 6.3 Class类文件的结构 Class文件是一组以8位字节为基础单位的二进制流. Class文件格式采用一种类似C语言结构伪结构存储数据,这种伪结构中只有两种数据类型:无符号数和表 ...

  3. 深入理解Java虚拟机-第1章-走进Java-读书笔记

    第 1 章 走近 Java 前言 Java 的技术体系主要是由支撑 Java 程序运行的虚拟机.为各开发领域提供接口支持的 Java API.Java 编程语言及许许多多的第三方 Java 框架(如 ...

  4. 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常

    第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域  

  5. 深入理解java虚拟机(七)类加载的时机

    Class 文件中描述的各种信息都必须加载到虚拟机中才能运行和使用.而虚拟机怎么加载这些Class 文件呢?Class 文件进入到虚拟机中会发生什么变化呢? 虚拟机类加载机制是指 虚拟机把描述类的数据 ...

  6. 深入理解java虚拟机_第二章_读书笔记

    1.本章内容目录: 概述 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 HotSpot虚拟机对象探秘 对象的创建 对象的内存布局 对象的访问定位 ...

  7. 重读《深入理解Java虚拟机》七、探究Java内存模型

    1.计算机物理内存结构(物理内存结构决定了虚拟机内存结构) 由于处理器和主存储设备在运算速度上不上同一个数量级上,因此处理器和主存储器之间不得不增设一层高速缓存,将部分在主存储设备的运算放在高速缓存内 ...

  8. 深入理解Java虚拟机 第三章 垃圾收集器 笔记

    1.1   垃圾收集器 垃圾收集器是内存回收的具体实现.以下讨论的收集器是基于JDK1.7Update14之后的HotSpot虚拟机.这个虚拟机包含的所有收集器有: 上图展示了7种作用于不同分代的收集 ...

  9. 深入理解java虚拟机-第四章

    第4章 虚拟机性能监按与故障处理工具 jps 虚拟机进程状况工具 jstat 虚拟机统计信息监视工具 JVM Statistics Monitoring Tool jstat [ option vmi ...

随机推荐

  1. hadoop2.7.x运行wordcount程序卡住在INFO mapreduce.Job: Running job:job _1469603958907_0002

    一.抛出问题 Hadoop集群(全分布式)配置好后,运行wordcount程序测试,发现每次运行都会卡住在Running job处,然后程序就呈现出卡死的状态. wordcount运行命令:[hado ...

  2. Mybatis中的ParameterType

    mybatis可以传入的参数类型1.基本数据类型       可以通过#{参数名}直接获取.每次只能传入一个值       <select id="selectTeacher" ...

  3. 20145217《网络对抗》web基础

    20145217<网络对抗>web基础 一.问题 1.什么是表单? 表单:可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单包括两个部分:一部分是HTML源代码用于描 ...

  4. Java实验五网络编程与安全

    实验五 网络编程与安全 实验准备 博客 活动一 两人一组结对编程: 0. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 1. 结对实现中缀 ...

  5. error: 'for' loop initial declarations are only allowed in C99 mode

    error: 'for' loop initial declarations are only allowed in C99 mode   出现错误: error: 'for' loop initia ...

  6. React-Native 常用组件学习资料链接

    以下链接是自己开发RN工程时参考的一些不错的资料,给喜欢学习的朋友分享以下. React-Native组件用法详解之ListViewhttp://www.jianshu.com/p/1293bb8ac ...

  7. [转]Markdown 公式指导手册(包含LaTeX)

    Cmd Markdown 公式指导手册 本文为转载文章,并且由于LaTeX的可能不能全部兼容,所以可能有部分公式无法在博客园显示,可以移步原网站. 本文固定链接: https://www.zybulu ...

  8. orecle 函数

    --创建函数语法 create [or replace] function [schema.]function_name (函数参数列表) --参数有IN.OUT.IN OUT三种类型:IN代表需要输 ...

  9. MyBatis使用自定义TypeHandler转换类型

    MyBatis虽然有很好的SQL执行性能,但毕竟不是完整的ORM框架,不同的数据库之间SQL执行还是有差异. 笔者最近在升级 Oracle 驱动至 ojdbc 7 ,就发现了处理DATE类型存在问题. ...

  10. 读jQuery之六(缓存数据)

    很多同学在项目中都喜欢将数据存储在HTMLElement属性上,如 1 2 3 4 <div data="some data">Test</div> < ...