JVM分为三个主要的子系统
(1)类加载器子系统(2)运行时数据区(3)执行引擎
1.类加载器子系统
Java的动态类加载功能是由类加载器子系统处理。当它在运行时(不是编译时)首次引用一个类时,它加载、链接并初始化该类文件。
1.1加载
类由此组件加载,遵循委托层次算法加载类文件。
- 启动类加载器:负责从启动类路径中加载类,rt.jar,优先级比较高
- 扩展类加载器:负责加载ext目录(jre/lib)内的类
- 应用程序类加载器:负责加载应用程序级别类路径,涉及到路径的环境变量等
1.2链接
- 校验 – 字节码校验器会校验生成的字节码是否正确,如果校验失败,我们会得到校验错误。
- 准备 – 分配内存并初始化默认值给所有的静态变量。
- 解析 – 所有符号内存引用被方法区(Method Area)的原始引用所替代。
1.3初始化
这是类加载的最后阶段,是所有的静态变量被赋初始值,并且静态块将被执行
1.4什么是类加载机制
Class文件描述的各种信息,都需要加载到虚拟机后才能运行。虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
1.5双亲委派模型
双亲委派模型(Parents Delegation Model)要求除了顶层的启动类加载器外,其余加载器都应当有自己的父类加载器。类加载器之间的父子关系,通过组合关系复用。
工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有到父加载器反馈自己无法完成这个加载请求(它的搜索范围没有找到所需的类)时,子加载器才会尝试自己去加载。
2.运行时的数据区(Runtime Data Area)
线程共享的数据区是堆和方法区,其他的都是线程私有的数据区
2.1方法区(Method Area)
- 所有类级别的数据将被存储在这里,在class被加载后的一些信息 如常量,静态常量这些被放在这里,在Hotspot里面我们将它称之为永生代。
- 每个JVM只有一个方法区,它是一个共享的资源
2.2 堆区(Heap Area)
- 他是最大的一块区域,用于