2、连接

连接就是将已经加载到内存中的类的二进制数据合并到Java虚拟机的运行时环境中去,加载阶段尚未完成,连接阶段可能已经开始。连接阶段包含验证、准备、解析过程。

2.1、验证

验证.class文件正确性,验证阶段大致会完成下面4个阶段的检验动作

(1)、文件格式验证,这一阶段主要验证字节流是否符合Class文件的格式规范,并且能被当前版本的虚拟机处理。

(2)、元数据验证,第二阶段是对字节码描述信息进行语义分析,以保证其描述的信息符合Java语言规范的要求,这个阶段可能包含的验证点如下:

  • 这个类是否有父类(除java.lang.Object类之外,其他所有类都应该有父类)
  • 这个类的父类是否继承了不允许被继承的类(被final关键字修饰的类)
  • 如果这个类不是抽象类,是否实现了其父类或接口之中要求实现的所有方法
  • 类中的变量、方法是否与父类产生冲突(如覆盖了父类的final属性,或者出现不符合规则的方法重载)等

第二阶段主要目的是对类的元数据信息进行语义校验,保证不存在不符合Java语言规范的元数据信息。

(3)、字节码验证,第三阶段是整个验证过程中最复杂的一个阶段,主要目的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。在第二阶段对元数据信息中的数据做完验证后,这个阶段将对类的方法体进行校验分析,保证被校验类的方法在运行时不会做出危害JVM安全的事件,例如:

  • 保证任意时刻操作数栈的数据类型与指令代码序列能配合工作,例如不会出现类似这样的情况:在操作栈放置了一个int型的数据,使用时却按照long类型加载入本地变量表中。
  • 保证跳转指令不会跳转到方法体以为的字节码指令上。
  • 保证方法体中的类型转换是有效的。等

(4)、符号引用验证,最后一个阶段的校验发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作将在连接的第三阶段——解析阶段中发生。符号引用验证可以看做是对类自身以外(常量池中的各种符号引用)的信息进行匹配性校验,通常需要校验以下内容:

  • 符号引用中是否能通过字符串描述的全限定名找到对应的类
  • 在指定类中是否存在符合方法描述的字段描述符以及简单名称所描述的方法和字段
  • 符号引用中的类、字段、方法的访问性(private、default、protected、public)是否可被当前类访问。等

2.2、准备

为类的静态变量分配内存,并初始化默认值,就像下面的这行代码,在准备阶段JVM给int变量i分配内存空间,并将i初始化为int型的默认值,在准备阶段时i=0。

private static int i = 1;

2.3、解析

解析阶段JVM会把类中的符号引用转换为直接引用,如下代码,Test类中的showA()方法中调用了类A的print()方法,这里a.print()就是符号引用,在解析阶段会把a.print()体会为方法区中一个指向A类的print()方法在方法区中内存地址的指针,而这个指针就是直接引用

 class A{
class A {
public void print() {
System.out.println("this is a");
}
} public class Test {
public void showA(A a) {
a.print();
}
}

符号引用(Symbolic References):符号引用是以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义的定位到目标即可。符号引用于虚拟机实现的内存布局无关,引用的目标不一定已经加载到内存中。各种虚拟机实现的内存可以各不相同,但是它们所接受的符号引用必须是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。

直接引用(Direct References):直接引用可以是指向目标地址的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用是和虚拟机实现的内存布局是相关的,同一个符号引用在不同的虚拟机中翻译出来的直接引用一般是不同的,如果有了直接引用,那引用目标一定已经在内存中了。

JVM类加载(2)—连接的更多相关文章

  1. JVM学习三:JVM之类加载器之连接分析

    学习完类加载之加载篇后,让我们继续来看加载之连接,连接分为三个步骤:验证.准备和解析三步,我们将一一分析之. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 类加载完毕之后进入 ...

  2. JVM类加载过程学习总结

    JVM类加载过程学习总结 先不说JVM类加载的原理,先看实例: NormalTest类,包含了一个静态代码块,执行的任务就是打印一句话. /** * 在正常类加载条件下,看静态代码块是否会执行 * @ ...

  3. JVM类加载续

    上一篇理解了JVM类加载过程的第一个阶段,这篇来说说剩下的阶段:验证.准备.解析.初始化.需要注意的是,这些阶段(解析除外)只是按照这个顺序开始,但是执行的过程中可能存在交叉. 验证:就是要对加载的二 ...

  4. 【深入Java虚拟机】一 JVM类加载过程

    首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默 ...

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

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

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

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

  7. 搞懂JVM类加载机制

    有这样一道面试题: class Singleton{ private static Singleton singleton = new Singleton(); public static int v ...

  8. 010 JVM类加载

    转自http://www.importnew.com/23742.html 前言 我们知道我们写的程序经过编译后成为了.class文件,.class文件中描述了类的各种信息,最终都需要加载到虚拟机之后 ...

  9. JVM类加载机制(转)

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

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

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

随机推荐

  1. mysql 导入数据是报错:2006 - MySQL server has gone away

    导SQL数据库结构+数据时,如果数据是批量插入的话会报错:2006 - MySQL server has gone away. 解决办法:找到你的mysql目录下的my.ini配置文件,加入以下代码 ...

  2. did not find a matching property (tomcat+Eclipse 报错)

    警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclips ...

  3. scala actor编程之对象传递

    scala 最吸引人的一点就是actor并发编程了.但是纵观scala官方文档,baidu文档,IBM文档都写的通过字符串传呀传,如果用作actor编程说明当然没有问题.但是在正式开放中,光传字符串就 ...

  4. Springmvc注解启用

      http://www.blogbus.com/wanping-logs/235898637.html 使用注解的原因 最方便的还是启用注解 注解方便,而且项目中很流行. 配置文件尽量减少,主要使用 ...

  5. STM32 ~ 串口DMA通道查找

    STM32F4XX: /**************************************************************************************** ...

  6. 第三篇、javascript整数和字符串

    一.整数 JavaScript中不区分整数值和浮点数值,JavaScript中所有数字均用浮点数值表示. 转换: parseInt(..)    将某值转换成数字,不成功则NaN parseFloat ...

  7. Vim 标签定义

    一.单个文件: m+标记字符 打上标记,如在开头行按ms(start),标记开头: 如需返回到自己的标记点,按`+标记字符就行: 二.多个文件: m+大写标记字符 如果删除了标签的行,同时也删除了标签 ...

  8. Can I run a local BLAST search again multiple blast databases simultaneously?

    from: https://secure.clcbio.com/helpspot/index.php?pg=kb.page&id=113 Can I run a local BLAST sea ...

  9. EntityFramework 学习 一 三种开发模式

    Entity Framework支持3种不同的开发方法 1.Code First 2.Model First 3.Database First Code First 使用Code First开发模式, ...

  10. maven命令创建项目

    1)创建一个Project mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArti ...