JVM类加载(2)—连接
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)—连接的更多相关文章
- JVM学习三:JVM之类加载器之连接分析
学习完类加载之加载篇后,让我们继续来看加载之连接,连接分为三个步骤:验证.准备和解析三步,我们将一一分析之. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 类加载完毕之后进入 ...
- JVM类加载过程学习总结
JVM类加载过程学习总结 先不说JVM类加载的原理,先看实例: NormalTest类,包含了一个静态代码块,执行的任务就是打印一句话. /** * 在正常类加载条件下,看静态代码块是否会执行 * @ ...
- JVM类加载续
上一篇理解了JVM类加载过程的第一个阶段,这篇来说说剩下的阶段:验证.准备.解析.初始化.需要注意的是,这些阶段(解析除外)只是按照这个顺序开始,但是执行的过程中可能存在交叉. 验证:就是要对加载的二 ...
- 【深入Java虚拟机】一 JVM类加载过程
首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默 ...
- JVM总结(四):JVM类加载机制
这一节我们来总结一下JVM类加载机制.具体目录如下: 类加载的过程 类加载过程概括 说说引用 详解类加载全过程: 加载 验证 准备 解析 初始化 虚拟机把描述类的数据从Class文件加载到内存,并对数 ...
- Java虚拟机(四):JVM类加载机制
1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...
- 搞懂JVM类加载机制
有这样一道面试题: class Singleton{ private static Singleton singleton = new Singleton(); public static int v ...
- 010 JVM类加载
转自http://www.importnew.com/23742.html 前言 我们知道我们写的程序经过编译后成为了.class文件,.class文件中描述了类的各种信息,最终都需要加载到虚拟机之后 ...
- JVM类加载机制(转)
原文出自:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运 ...
- Android动态加载--JVM 类加载机制
动态加载,本质上是通过JVM类加载机制将插件模块加载到宿主apk中,并通过android的相关运行机制,实现插件apk的运行.因此熟悉JVM类加载的机制非常重要. 类加载机制:虚拟机把描述类的数据从C ...
随机推荐
- python网络爬虫之scrapy 调试以及爬取网页
Shell调试: 进入项目所在目录,scrapy shell “网址” 如下例中的: scrapy shell http://www.w3school.com.cn/xml/xml_syntax.as ...
- parent
<?php class MyObject { function myMethod() { //标准功能 echo "Standard Functionality\n"; } ...
- Python decorator @property
@property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性 下面的链接很好的阐述了@property的概念和应用 http: ...
- 【leetcode刷题笔记】3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- Linux Shell总结
Shell编程总结: 1.linux命令 2.位置变量 $0 $1 $# $? 3.条件测试 [ ] [[ ]] (( )) if case 4.循环for while 5.打印echo cat 6. ...
- CentOS下查看文件和文件夹大小
当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. 当磁盘大小超过标准时会有报警提示,这时如 ...
- BZOJ 2527 [Poi2011]Meteors:整体二分
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2527 题意: 有n个国家和m个空间站,每个空间站都属于一个国家,一个国家可以有多个空间站, ...
- jQuery应用之eraser.js使用,实现擦除、刮刮卡效果
jquery.eraser是一款使用鼠标或触摸的动作来擦除画布显示真正图片的插件.jquery.eraser插件的原理是用一个画布遮住图片,然后根据触摸或鼠标输入来擦除画布显示图片,您可以在参数中指定 ...
- 一个ClientDataset的Delta与XML相互转换
一个ClientDataset的Delta与XML相互转换的文章: 大家都知道TClientDataSet的Delta属性保存数据集的变化,但是Delta是OleVariant类型的属性,这样如果用D ...
- 分享知识-快乐自己:HBase编程
HBase编程: 一):大数据(hadoop)初始化环境搭建 二):大数据(hadoop)环境搭建 三):运行wordcount案例 四):揭秘HDFS 五):揭秘MapReduce 六):揭秘HBa ...