标签:启动 执行 java语言 标记 app 方法 height 应用 语法
定义:类的加载是指将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆中创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
某个类被“首次主动使用”时加载它,或类加载器在预料某个类将要被使用时就预先加载它
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。
类加载的过程包括了加载、验证、准备、解析、初始化五个阶段
① 通过类的全限定名来获取类的二进制字节流;
② 将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构;
③ 在堆生成一个代表该类的Class对象,作为方法区中这些数据的访问入口;
主要是确保被加载类的正确性
① 文件格式的验证:验证.class文件字节流是否符合class文件规范;
② 元数据验证:主要对字节码描述的信息进行语义分析,以保证其描述的信息符合java语法规定;
③ 字节码验证:主要是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的;
④ 符号引用验证:发生在虚拟机将符号引用转化为直接引用的时候。主要是对类自身以外的信息进行校验。目的是确保解析动作能够完成。
解析阶段主要是虚拟机将常量池中的符号引用转化为直接引用的过程。
符号引用:即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个类的相关信息。
直接引用:可以理解为一个内存地址,或者一个偏移量。比如类方法,类变量的直接引用是指向方法区的指针;而实例方法,实例变量的直接引用则是从实例的头指针开始算起到这个实例变量位置的偏移量。
举个例子来说,现在调用方法hello(),这个方法的地址是0xaabbccdd,那么hello就是符号引用,0xaabbccdd就是直接引用。
在解析阶段,虚拟机会把所有的类名,方法名,字段名这些符号引用替换为具体的内存地址或偏移量,也就是直接引用。
1、JAVA语言系统自带有三个类加载器
① Bootstrap ClassLoader:加载核心类库,也就是我们环境变量下面%JRE_HOME%\lib
② Extention ClassLoader:扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件
③ Appclass Loader:加载当前应用的classpath的所有类
二、双亲委派原则
② 更加安全,很好的解决了各个类加载器的基础类的统一问题,如果不使用该种方式,那么用户可以随意定义类加载器来加载核心api,会带来相关隐患。
标签:启动 执行 java语言 标记 app 方法 height 应用 语法
原文地址:https://www.cnblogs.com/long518/p/12904787.html