JVM概述
对Java程序的运行过程更加了解,中、高级程序员必备技能。
JVM作用:jvm负责将字节码文件加载到虚拟机中,再将字节码文件,解释\编译为机器码,管理运算时数据存储,垃圾回收(GC);现在的jvm还可以执行其他语言编译后的字节码文件。
JVM构成
- 类加载系统:负责从硬盘上加载字节码文件到JVM中
- 运行时数据区:按照不同的数据分区进行存储(方法区,堆,栈,本地方法栈,程序计数器)
- 执行引擎:将字节码再次编译/解释为机器码
- 本地库接口:负责调用本地操作系统方法
类加载子系统
负责从硬盘上加载字节码文件到jvm中
类加载过程:
- 加载
以二进制字节流的方式加载字节码,在内存中为类生成一个Class对象,将静态存储转为运行时存储 - 链接
验证:验证字节码格式是否正确; 验证语法是否正确
准备:准备阶段则负责为类的静态属性分配内存,并设置默认初始值;
static int a = 0; 准备阶段
static int a = 10; 初始化阶段
解析: 将静态文件中的指令符号引用替换成内存中直接引用 - 初始化
对类的静态变量赋予正确的初始值
类什么时候会被初始化?
使用类中的静态变量,静态方法,在一个类中运行main方法,创建对象,使用反射加载一个类,当加载一个类的子类,而且优先加载父类
注意: 当只使用某个类中静态常量时,类不会被初始化,因为在编译阶段就初始化
当类在加载阶段初始化完成,才说明类的整个加载过程结束.
类加载器
真正实施类加载的实现者
宏观上分为俩类:
- 引导类加载器(启动类加载器), 不是用java语言实现的, C/C++ jvm底层实现
- 其他类加载器,用java语言写的实现类, 都继承java.lang.ClassLoader
细分:
- 引导类加载器(启动类加载器)
java中系统提供的类,都是由启动类加载器加载 例如String - 扩展类加载器
Java 语言编写的,由sun.misc.LauncherExtClassLoader 实现. 派生于 ClassLoader 类. jre/lib/ext 子目录(扩展目录)下加载类库 - 应用程序类加载器(系统类加载器)
Java 语言编写的,由 sun.misc.Launcher$AppClassLoader 实现. 派生于 ClassLoader 类. 加载我们自己定义的类,用于加载用户类路径(classpath)上所有的类 - 自定义的类加载器
例如我们自己写一个类,继承ClassLoder
再例如tomcat这种容器,都会有自己加载类的加载器