Java学习笔记 - JVM加载类纯语言描述
2015-09-02 23:27
495 查看
JVM加载类到内存经过三个步骤,类加载,连接,初始化,这三个步骤统称为类加载或者类初始化。
是说当程序使用任何类时,系统都会为之建立一个java.lang.Class对象。(所以反射的时候可以先得到Class的一个实例)。
类的加载通过类加载器来完成,类加载器由JVM提供。通过使用不同的类加载器,可以从不同来源加载类的二进制数据:
1、 从本地文件系统来加载class文件
2、 从JAR包中加载class文件(如JDBC连接数据库)
3、 通过网络加载class文件
4、 把一个Java源文件动态编译、并执行加载
注:类加载器通常无须等到“首次”使用该类时才加载该类,Java虚拟机规范允许系统预先加载某些类。
阶段将会负责把类的二进制数据合并到JRE中。类连接分为下面三个阶段:
1、 验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致。
2、 准备:类准备阶段则负责为类的静态属性分配内存,并设置默认初始值。
3、 解析:将类的二进制数据中的符号引用转换为直接引用。
在Java类中对静态属性初始化有两种方式:
1、声明静态值时指定初始值
2、使用静态块初始化为静态属性指定的值。
类的初始化一般包含下面几个步骤:
1、假如这个类还没有被加载和连接,程序先加载并连接该类。
2、假如该类的直接父类还没有被初始化,则先初始化其直接父类。
3、假如类中有初始化语句,则系统依次执行这些初始化语句。
注:当执行第二步的时候,系统对其父类的初始化也遵循上面步骤。所以JVM最优先初始化的总是java.lang.Object类。当程序主动使用任何一个类时,系统会保证该类以及所有父类都会被初始化。
一、类加载
类加载是指将类的class文件读入内存,并为之创建一个java.lang.Class对象,也就是说当程序使用任何类时,系统都会为之建立一个java.lang.Class对象。(所以反射的时候可以先得到Class的一个实例)。
类的加载通过类加载器来完成,类加载器由JVM提供。通过使用不同的类加载器,可以从不同来源加载类的二进制数据:
1、 从本地文件系统来加载class文件
2、 从JAR包中加载class文件(如JDBC连接数据库)
3、 通过网络加载class文件
4、 把一个Java源文件动态编译、并执行加载
注:类加载器通常无须等到“首次”使用该类时才加载该类,Java虚拟机规范允许系统预先加载某些类。
二、类的连接
当类被加载后,系统会为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段将会负责把类的二进制数据合并到JRE中。类连接分为下面三个阶段:
1、 验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致。
2、 准备:类准备阶段则负责为类的静态属性分配内存,并设置默认初始值。
3、 解析:将类的二进制数据中的符号引用转换为直接引用。
三、类的初始化
类的初始化阶段,虚拟机负责对类进行初始化,主要就是对类的静态属性进行初始化。在Java类中对静态属性初始化有两种方式:
1、声明静态值时指定初始值
2、使用静态块初始化为静态属性指定的值。
类的初始化一般包含下面几个步骤:
1、假如这个类还没有被加载和连接,程序先加载并连接该类。
2、假如该类的直接父类还没有被初始化,则先初始化其直接父类。
3、假如类中有初始化语句,则系统依次执行这些初始化语句。
注:当执行第二步的时候,系统对其父类的初始化也遵循上面步骤。所以JVM最优先初始化的总是java.lang.Object类。当程序主动使用任何一个类时,系统会保证该类以及所有父类都会被初始化。
相关文章推荐
- Java编码中出现的乱码问题
- 简述利用list实现简易电话本管理系统
- spring事务PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED区别
- Java设计模式--Java设计模式介绍
- Java多线程之常用方法
- 最最常用的 100 个 Java 类(转)
- 关于Android studio 相对 eclipse 优点
- ACM中使用JAVA v2.1
- 配置jdk环境变量
- Java Executors框架的源码理解
- 【SSM】spring与mybatis三种整合方法
- Myeclipse10破解
- Java注解
- Java Native Interface Specification
- Eclipse无法启动或停留在Loading workbench呈灰色无响应状态
- JAPX(JAVA API for xml)中dom解析思路
- Ubuntu 设置Java环境变量
- JavaSE复习日记 : 多态
- Ubuntu14.04 快速安装JDK1.8
- Java字符流与字节流的区别