文章有点枯燥但是每个字都是我亲手码的因为这样我才能更好的掌握这些知识,所以耐心看吧,如果你想学习JVM,而不是当一个初级的搬运工或者CRUD工程师。
当我们使用java命令运行某个类的main函数时首先通过类加载器将主类加载到JVM。
类加载器的流程图如下:
其中loadClass的加载过程有一下几步:
加载 验证 准备 解析 初始化 使用 和卸载
1.加载 在硬盘上查找文件并通过IO获取文件字节码,采用懒加载的形式。即调用才加载。
在加载阶段会在内存中生成一个代表该类的String 对象 作为方法区这个类的各种数据的访问入口
2.验证 验证字节码文件的正确性
3.解析, 静态链接 如静态方法 main方法 等会在这个时候从符号引用转变成直接引用,动态链接是在程序中用到时才将符号转变成引用。
4. 初始化 对该类的静态变量和静态块进行运行
类被加载到方法区后主要包含 运行时常量池 类型信息 字段信息 方法信息 类加载器的引用 对应class实例的引用信息等。
类加载器的引用:这个类到类加载器实例的引用
对应class实例的引用 : 类加载器将类的信息加载到方法区后,会创建一个对应class类型的对象实例放到堆中,作为开发人员访问方法区中类定义的入口和切入点。
主类运行过程中如果使用到其他类 会逐步加载。
jar包和war包中的类也不是一次性加载的而是用到才加载。
下面写一段实例讲解:
public class TestLoad{