JVM整体结构
- class文件生成模块(通过jdk中自带javac编译命令来生成class文件)
- 类加载器子系统模块(将class字节码加载到JVM虚拟机内存中)(在这个结构中占主要功能)
- 内存空间主要分为方法区、Java堆、Java栈、本地方法栈,分别用来存储class字节码不同的内容
- GC模块
编译流程:
JVM中的类加载器
Bootstrap ClassLoader(专门用来加载jre\lib\rt.jar包中的字节码)
Extension ClassLoader(专门用来加载jre\lib\ext中所有jar包的字节码)
前两个加载器是用来加载jdk中特定的jar包的
App ClassLoader(加载应用程序中的ClassLoader)
Custom ClassLoader(自定义的ClassLoader,可以进行重写来加载指定的class文件)
加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
类的加载流程
Loading:类的信息从文件中获取并且载入到JVM的内存里(将class字节码加入了内存当中)
Verifying:检查读入的结构是否符合JVM规范的描述(验证字节码)
Preparing:分配一个结构用来存储类信息
Resolving:把这个类的常量池中的所有的符号引用改变成直接引用
Initializing:执行静态初始化程序,把静态变量初始化成指定的值