`

JVM学习笔记六 之 连接(类型的生命周期系列)

    博客分类:
  • jvm
阅读更多

一、概述

类型的连接是指把字节码二进制静态结构合并到运行时状态中去。连接又分为验证、准备和解析三个阶段。

二、验证

验证装载到jvm中的字节码流的合法性。jvm spec没有规定具体做什么验证。根据不同的虚拟机实现大概又分为语法验证、语义验证、字节码流验证和引用验证。

1、语法验证,校验字节码语法正确性,使得该类型信息可以存储在方法区内,如魔数、主次版本号、Utf8常量池表项中存储的是合法的utf8值、常量池表项的tag值在是spec中规定的取值范围内、字节码完整未被删除或添加多余数据等。

2、语义验证,校验字节码符合java语言规范,如除了Object外所有对象都必须有一个超类、非抽象类必须实现超类或接口中的抽象方法、不能继承final类、不能重写final方法、不能改变final字段值、不能有同名同参不同返回值的方法。

3、字节码流验证,此阶段是校验方法的字节码,如跳转指令不能跳转到方法体以外、指令后跟正确的操作数如操作long类型值的指令后不能是个int型的值、类型转换有效JDK1.6添加了StackMapTable属性加快字节码流校验,其内部存储的是本地变量表和操作数栈的初始状态。

4、引用验证,验证符号引用的对象合法, 如引用的类型/方法/字段等存在、具有类型/方法/字段的访问权限(private/protected/public)。

三、准备

准备阶段是为类变量分配内存并赋默认值,如果字段有ConstantValue属性,就把ConstantValue里的值作为字段的初始值。根据特定实现,也可能为方法表等别的结构分配内存。

四、解析

解析就是把产量池的符号引用解析为直接引用。

符号引用:符号描述表示的引用

直接引用:指向特定对象如实例、实例方法、字段、静态方法的内存地址、偏移量或间接句柄。

不同类型的常量池类型,解析方法不同。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics