JVM 类加载
Java类加载机制
类加载行为发生的时间 : 在Java代码中,类型的加载,连接和初始化过程都是在运行期间完成的;
一个类的生命周期分为七个阶段: 加载
,连接
(验证,准备,解析),初始化
,使用
,卸载
;
类的生命周期结束
类结束生命周期的几种情况 :
- 执行了System.exit()方法
- 程序正常结束
- 程序在执行过程中遇到了异常或者错误而异常终止
- 由于操作系统出现错误而导致Java虚拟机进程终止
类加载的三个重要阶段简介
最重要的三个阶段:加载,连接,初始化,下面简单介绍这三个阶段做的事情:
- 加载:查找并加载类的二进制数据
- 连接
- 验证:确保被加载类的正确性
- 准备:
为类的静态变量分配内存,并将其初始化为默认值
- 解析:把类的符号引用转化为直接引用
- 初始化:
为类的静态变量赋于正确的初始值
类的被动使用和主动使用
Java程序对类的使用方式:主动使用
,被动使用
Java虚拟机实现必须在每个类或者接口
首次主动使用
时初始化它们
主动使用的几种情况:
- 1.创建类的实例
- 2.访问某个类或接口的静态变量,对该
静态变量
赋值 或者调用类的静态方法
- 3.反射(如Class.forName(“com.xxx.xxx”))
- 4.初始化一个类的子类(child初始化parent一定被初始化)
- 5.标记为启动类的类
- 6.jdk1.7动态语言的支持;
除了以上情况,其他方式都是类的被动使用,都不会导致类的初始化;
类的加载
定义:类的加载指的是将类的.class文件的二进制数据读入到内存中,将其放在运行时数据区的方法区内(jdk1.8元空间
),然后在内存中创建一个java.lang.Object对象用来封装类在方法区内的数据结构(规范并未说明Class对象位于那里,HotSpot虚拟机将其放在了方法区中)
加载Class文件的方式:
- 在本地系统中直接加载
- 通过网络下载
- 从zip,jar等归档文件中加载
- 从专有数据库中加载
- 将Java源文件动态的编译为.class文件(如JSP转化为Servlet)
静态变量所在类的主动使用
- 只有定义了该字段的类才会被初始化
- 子类在初始化时,要求它的父类先被初始化