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()方法在方法区中内存地址的指针,而这个指针就是直接引用

 1 class A{
 2     class A {
 3         public void print() {
 4             System.out.println("this is a");
 5         }
 6     }
 7
 8     public class Test {
 9         public void showA(A a) {
10             a.print();
11         }
12     }

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

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

转载于:https://www.cnblogs.com/qiyexue/p/6822201.html

JVM类加载(2)—连接相关推荐

  1. 【Java虚拟机规范】JVM类加载机制

    [Java虚拟机规范]JVM类加载机制 理论知识 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading).验证(Verification).准备(Prep ...

  2. jvm类加载机制_JVM 类加载机制

    学习导图 一.为什么要学习类加载机制? 今天想跟大家唠嗑唠嗑 Java 的类加载机制,这是 Java 的一个很重要的创新点,曾经也是 Java 流行的重要原因之一. Oracle 当初引入这个机制是为 ...

  3. JVM类加载机制(ClassLoader)源码解析

    http://blog.csdn.net/chenyi8888/article/details/7066569 其实JVM类加载机制,简单地说就是类管理,也就是我们生成的class文件. 三个步骤:装 ...

  4. JVM(2)——JVM类加载机制

    一.JVM类加载机制简介 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言里面 ...

  5. jvm类加载机制和类加载器_在JVM之下–类加载器

    jvm类加载机制和类加载器 在许多开发人员中,类加载器是Java语言的底层,并且经常被忽略. 在ZeroTurnaround上 ,我们的开发人员必须生活,呼吸,饮食,喝酒,并且几乎与类加载器保持亲密关 ...

  6. jvm类加载过程_JVM类生命周期概述:加载时机与加载过程

    作者:菜鸟小于 https://www.cnblogs.com/Young111/p/11359700.html 一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描 ...

  7. Java高并发编程详解系列-JVM类加载器

    之前的博客中提到了类加载的过程,提到了双亲委托机制,提到了关于类加载器的概念,这篇博客就来给大家分享一下什么是JVM的类加载器.通过实战的方式来了解一下类加载器器到底是什么. JVM类加载器分类    ...

  8. JVM类加载机制详解

    本文来详细说下JVM类加载机制 文章目录 概述 类加载器是什么 类加载的过程 加载 连接 初始化 类的主动引用和被动引用 主动引用 被动引用 三种类加载器 双亲委托机制 核心思想 源码分析 类的动态加 ...

  9. 【JVM】第二章 JVM类加载、JVM对象

    第二章 JVM类加载.JVM对象 文章目录 第二章 JVM类加载.JVM对象 一.JVM类加载 1.介绍 2.类加载器 3.类加载机制 4.类加载过程 二.JVM对象 1.对象的内存布局 2.对象的访 ...

  10. JVM类加载、验证、准备、解析、初始化、卸载过程详解

    目录 0 使用类的准备工作 初始化(Init) 1 加载(Load) 1.1 详细过程 1.1.1 通过类全限定名获取该类的二进制字节流 1.1.2 静态存储结构=>运行时数据结构 1.1.3 ...

最新文章

  1. Mac-远程连接Mac
  2. java多线程爬虫框架crawler4j的使用
  3. 内网服务器文件如何加密,局域网共享文件如何加密?
  4. oracle将原表数据加入新建表,Oracle新建用户并将原有表结构数据迁移,修改密码...
  5. 解决listview addheader EditText焦点问题
  6. VM安装rhel或linux后,声音很响,如何关闭
  7. Maven pom.xml中的元素modules、parent、properties以及import(转)
  8. Navicat数据库查询时字体
  9. AR VR MR 到底有啥区别?
  10. 家用路由器配置方法(精简版)
  11. Python(二)之流程控制(顺序控制、条件控制、循环控制)
  12. 英语及计算机水平自我鉴定,大学英语专业自我鉴定
  13. IN+子查询(Mysql)
  14. Chrome书签整理
  15. SpringBoot配置文件的修改
  16. 区块链可能颠覆全球商品市场
  17. Quantum LeaPs(QP)介绍
  18. 【安全硬件】Chap.2 如何破译一个CMOS门级电路;传播延迟、动态功耗、静态功耗可能泄露电路的构造以及输入密钥;非侵入式攻击 Non-Invasive Attacks
  19. Android开机键失灵启动手机的解决办法
  20. 浏览器原理与常用协议总结

热门文章

  1. Unknown initial character set index '255' received from server.
  2. jd-eclipse反编译插件的离线安装和使用
  3. springboot启动流程,手把手打断点一步步看运行步骤
  4. 在Flutter中设置更好的Logging的指南
  5. 方法的定义使用,方法重载及方法的递归调用
  6. 妈妈帮携手神策数据 数据赋能打造母婴智能陪伴者
  7. 神策数据荣获“2017金融科技·大数据优秀案例之最佳实践案例奖”
  8. 盛大游戏回归A股进入倒计时:估值近300亿 腾讯年初曾入股
  9. Java Web之文件的上传及下载
  10. 移动设备将成为2014年最大的安全风险