JVM之类加载器

本文详细介绍了Java Class文件结构,包括魔数、版本号、常量池等关键元素。接着,阐述了类加载机制的五个阶段:加载、验证、准备、解析和初始化。在加载过程中,类结构信息存储到方法区,堆中生成Class对象。类加载到JVM内存后,静态变量在准备阶段分配内存,初始化阶段执行静态代码块。最后讨论了类的卸载条件。
摘要由CSDN通过智能技术生成

一、Class类文件结构

任何一个Class文件都对应一个类或者接口定义信息,但反过来类或者接口并不一定都得定义在文件(可以动态生产,直接送入到类加载器中)。字节码文件结构包含以下结构:
魔数:识别class文件格式,唯一作用是确定这个文件是否是一个能被虚拟机接受的class 文件(Class 文件标识)。基于安全考虑,而不是文件后缀。

class文件的版本号:小版本号和大版本号,JDK1.8大版本52(向下兼容,高版本的JVM可以解释运行低版本的字节码文件)

常量池:常量池计数器和常量池表,常量池表存放编译生成的字面量和符号引用,在类加载后进入到方法区的运行时常量池中(JDK8将字符串常量池放到Java堆中)。常量池计数器表示N-1个常量,第0个表示不引用任何常量池项目。常量池表存放:字面量和符号引用

字面量:字符串、常量

符号引用:类和接口全限定名、字段的名称和描述、方法的名称和描述

在字节码文件中,并没有保存各个方法、字段的内存地址,只有符号引用,经过类加载后解析成直接引用

访问标志:标识是接口还是类、是否定义public、abstract等

类索引、父类索引、接口索引集合

字段表集合:类变量和实例变量

方法表集合

属性表集合

二、类加载机制

一个类型(类或者接口)从Class文件加载到虚拟机内存中,到卸载出内存。总共经历以下阶段:加载=》验证=》准备=》解析=》初始化=》使用=》卸载

加载:查找加载类的二进制数据,生成Class实例

1)通过一个类的全限定名来获取定义此类的二进制数据

2)将字节流所代表的静态存储结构转化为方法区的运行时数据结构,类结构(JDK7之前包括JDK7是放到永久代,JDK8放到元空间)

3)在内存生成一个代表这个类的Java.lang.Class对象,作为方法区这个类各种数据的访问入口

运行时计算生成,这种场景使用得最多的就是动态代理技术,在java.lang.reflflect.Proxy中,就是用了

ProxyGenerator.generateProxyClass()来为特定接口生成形式为“*$Proxy”的代理类的二进制字节流。

二进制数据获取方式:通过文件系统读入一个class文件、通过jar、zip提取类文件、网络传输、数据库读取、动态生成class文件

类结构信息存储到方法区中,在堆中生成Class对象,这个对象指向方法区中类结构(这个对象不是实例对象 是类对象)

验证:确保Class文件的字节流包含的信息是否符合虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全。

主要包括四种验证:文件格式验证(魔数、版本号、长度)、元数据验证、字节码验证、符号引用验证(类、方法、字段是否存在)

准备:正式为类中定义的变量(静态变量)分配内存并设置类变量初始值的阶段在方法区中(还没有初始化)。

(注:final 修饰的static不是 类变量了,属于常量,在编译时候就已经分配好,准备阶段就显示赋值,字面量也是在这个阶段显示赋值)

解析:将常量池的符号引用转成直接引用过程(内存地址)

解析动作主要针对类或接口、类方法、字段、接口方法、方法类型等

初始化:静态变量赋值和静态代码块执行

1)只有遇到new、getstatic、putstatic、invokestatic这四条字节码指令才初始化。Java代码场景:new、读取或者设置类型的静态字段、调用类型的静态方法时候。

2)对类型进行反射调用

3)初始化类时,父类没有进行初始化

4)虚拟机启动需要执行的主类

5)动态语言支持

6)JDK8默认方法类初始化了,接口要在之前初始化。

初始化阶段就是执行类构造器方法()的过程,该方法是javac编译器自动收集类中所有类变量赋值动作和静态代码块合并生成,不需要用户自己定义。如果源代码中没有类变量和静态代码块,就没有()方法。不同于类的构造器

方法中的指令是按照源文件中出现的顺序执行。类加载过程中,在准备阶段会给类变量分配内存空间并附初始值。

使用:类的主动使用和被动使用。

卸载:类的卸载是在方法区中回收,需要同时达到三个条件:该类的所有实例都已经被回收了、该类没有任何引用、该类的类加载器已经被回收了。

三、类加载到JVM内存

类结构信息存储到方法区中,堆中生成Class对象,类的加载器对象,加载Class对象,实例对象通过Class对象创建到堆中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值