JVM就是Java Virtual Machine ,Java 虚拟机
Java之所以能够实现一次编译,多次运行(Write Once,Run anywhere),就是因为JVM,其第一次编译生成了字节码文件(classFile),接下来只需在有JVM环境的任何操作系统上都可以运行
在Java虚拟机中,也就是JVM中,首要的就是类加载器,其首先对字节码文件进行加载,链接,初始化操作。
加载
加载过程
1.通过一个类的权限定名获取定义此类的二进制字节流
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3.在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口
注意
ClassLoader 只负责class文件的加载,至于是否可以运行,具体由Execution Engine来决定
不管是什么样的字节码文件,在开头都会有特定的文件标识,在二进制字节流中,就是CA FE BA BE。
加载的类信息存放于内存中的内存空间的方法区中,其中还包括了运行时的常量池信息。
如果装载的时候失败了,就会抛出异常,否则就会进入链接阶段
链接
链接过程
验证(Verify)
验证被加载的类的准确性,保证安全,不被恶意修改
有四种验证方式,文件格式验证,元数据验证,字节码验证,符号引用验证
准备(Prepare)
为类变量分配内存并且设置该类变量的默认初始值,也就是零值,即在准备阶段,类的变量都会是默认值,只有到了初始化阶段(initization),才会赋值
如果用final修饰的static变量,那么在这个阶段,就会显示初始化,因为final在编译的时候就分配了空间和值
解析(Resolve)
将常量池内的符号引用转换为直接引用的过程
解析伴随着初始化执行完之后再执行
在程序中,我们通常会用到一些这样那样的类,