当前位置: 移动技术网 > IT编程>开发语言>Java > JVM学习(1):类加载机制

JVM学习(1):类加载机制

2020年03月12日  | 移动技术网IT编程  | 我要评论

class文件结构解析:

网上看到几篇文章对java的class文件解析写的比较全面:

 

类加载机制:

第一步:加载

1.获取二进制字节流

2.静态存储结构转化为方法区的运行时数据结构

运行时数据区有:【方法区,堆】,【虚拟机栈,本地方法栈,程序计数器】

3.在java堆中生成一个类对象,作为方法区的访问入口

 

第二步:验证

1.验证class文件标识:魔术magic number:cafebabe

2.验证class文件版本号

3.验证常量池(常量类型,常量类型数据结构是否正确,utf-8是否符合标准)

4.class文件的每个部分(字段表、方法表等)是否正确

5.元数据验证(父类验证、继承验证、final字段验证等)

6.字节码验证,最复杂的步骤(指令验证)

7.符号引用验证(验证通过符号引用是否能够找到字段、方法、类)

 

在验证期间会报的错:

incompatibleclasschangeerror--->class文件错误

unsupported major.minor version xx.x--->版本有问题(通常指jdk版本问题)

illgalaccesserror;nosuchfielderror;nosuchmethoderror等等

 

第三步:准备

为类变量分配内存并且设置类变量的初始化阶段,只对static类变量进行内存分配

 

例:(1)static int n=1;(2)static final int n=2;

在初始化时的区别:

(1)情况初始化后,初始化的值是0,而不是2,因为这时候还没执行任何java方法,静态块最后是又clint调用的

(2)情况对应到常量池(constantvalue),在准备阶段n已经被赋值为2

 

类变量和实例变量的区别:

类变量:一般称为静态变量

实例变量:当对象被实例化的时候,实例变量随着对象创建而创建,随着对象的销毁而销毁

 

第四步:解析

对符号引用进行解析,把符号引用变为直接引用

直接引用:指向目标的指针或者说是一个偏移量

 

主要涉及:类、接口、字段、方法等

以下的类型:

constant_class_info

constant_field_info

constant_methodref_info

constant_interfacemethodred_info

constant_methodtype_info

constant_methodhandler_info

constant_invokedynamic_info

 

1.字段的解析:

在本类中找有没有匹配的字段--->如果类有接口,往上层接口找匹配的字段--->搜索父类

例如:

class a extends b implements c,d{
private string str;
}

搜索顺序:先在a类(本类)找,然后从c,d类(父接口)中找,接下来去b类(父类)找,最后去object类找

找不到会报错:java.lang.nosuchfielderror

如果找到但是没有权限(private):java.lang.illegalaccesserror

 

2.类方法的解析:

class a extends b implements c,d{
private void test(){
......
}
}

在本类里面找有没有匹配的方法,如果没有前往父类找匹配的方法,没找到去接口列表里面找匹配的方法

如果本类没找到,接口找到了,那么说明本类是:abstract抽象类

如果最终没有找到报错:java.lang.nosuchmethoderror

如果找到但是没有权限(private):java.lang.illegalaccesserror

 

3.接口方法的解析:

在本类里面找有没有匹配的方法,然后在父接口中递归查找

如果最终没有找到报错:java.lang.nosuchmethoderror

接口一般不会是private,所以没有illegalaccesserror

 

第五步:初始化

<init>类的初始化

<clinit>静态变量,静态块的初始化;如果代码中没有静态变量和块,那么没有clint

比如以下的代码中:

class a{
 static int i=2;//clint
 static {//clint
   system.out.println("hello world!");
 }
 int n;//init
}

 

第六步:使用

无需解释

 

第七步:卸载

垃圾回收后面再学

 

以上的验证,准备,解析三步又称为连接

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网